从CCD采集图象到计算机,再同时显示出来
m_pRawBuffer1:=AllocMem(nWidth*nHeight);
m_pImageBuffer1:=AllocMem(nWidth*nHeight*3);
//设置bitmapinfo
m_pBitmapInfo:=AllocMem(sizeof(BITMAPINFOHEADER));
m_pBitmapInfo^.bmiHeader.biSize:=sizeof(BITMAPINFOHEADER);
m_pBitmapInfo^.bmiHeader.biWidth:=nWidth;
m_pBitmapInfo^.bmiHeader.biHeight:=nHeight;
m_pBitmapInfo^.bmiHeader.biPlanes:=1;
m_pBitmapInfo^.bmiHeader.biBitCount:=24;
m_pBitmapInfo^.bmiHeader.biCompression:=BI_RGB;
m_pBitmapInfo^.bmiHeader.biSizeImage:=0;
m_pBitmapInfo^.bmiHeader.biXPelsPerMeter:=0;
m_pBitmapInfo^.bmiHeader.biYPelsPerMeter:=0;
m_pBitmapInfo^.bmiHeader.biClrUsed:=0;
m_pBitmapInfo^.bmiHeader.biClrImportant:=0; SetLength(ppBuff,1);
ppBuff[0]:=m_pRawBuffer1; if HVSnapShot(HHV1, ppBuff, 1)=STATUS_OK then
begin
//将原始图像数据进行Bayer转换,转换后为24位。
//同时将原始数据进行上下翻转
ConvertBayer2Rgb(m_pImageBuffer1,
m_pRawBuffer1,
nWidth,
nHeight,
BAYER2RGB_NEIGHBOUR,
m_pLutR,m_pLutG,m_pLutB,
true,
BAYER_GR); //在视图客户区显示图像
PicDC:=GetDC(Cpic.Handle); StretchDIBits(PicDC,
0,0,
320,240,
0,0,
m_pBitmapInfo^.bmiHeader.biWidth,
m_pBitmapInfo^.bmiHeader.biHeight,
m_pImageBuffer1,
m_pBitmapInfo^,
DIB_RGB_COLORS,
SRCCOPY); ReleaseDC(Cpic.Handle,PicDC);
end;如果分辨率是640*480时无论保存图象还是实时显示都没有问题,如果分辨率是1024*768时保存没有问题,但StretchDIBits函数不再显示图象如果两个CCD同时在640*480下工作,象下面这样分配两组内存时,两个CCD都能正常保存图象,但只有一个CCD能实时显示。即用到m_pImageBuffer1的StretchDIBits能显示,而m_pImageBuffer2的StretchDIBits函数不显示
m_pRawBuffer1:=AllocMem(nWidth*nHeight);
m_pImageBuffer1:=AllocMem(nWidth*nHeight*3);
m_pRawBuffer2:=AllocMem(nWidth*nHeight);
m_pImageBuffer2:=AllocMem(nWidth*nHeight*3);但是只要去掉上面的一组内存,对应于两个CCD的StretchDIBits函数用同一组内存时又可以正常保存与显示。似乎是StretchDIBits函数只要访问比较大的地址的内存时就不再显示,这是什么原因??????
m_pRawBuffer1:=AllocMem(nWidth*nHeight);
m_pImageBuffer1:=AllocMem(nWidth*nHeight*3);
//设置bitmapinfo
m_pBitmapInfo:=AllocMem(sizeof(BITMAPINFOHEADER));
m_pBitmapInfo^.bmiHeader.biSize:=sizeof(BITMAPINFOHEADER);
m_pBitmapInfo^.bmiHeader.biWidth:=nWidth;
m_pBitmapInfo^.bmiHeader.biHeight:=nHeight;
m_pBitmapInfo^.bmiHeader.biPlanes:=1;
m_pBitmapInfo^.bmiHeader.biBitCount:=24;
m_pBitmapInfo^.bmiHeader.biCompression:=BI_RGB;
m_pBitmapInfo^.bmiHeader.biSizeImage:=0;
m_pBitmapInfo^.bmiHeader.biXPelsPerMeter:=0;
m_pBitmapInfo^.bmiHeader.biYPelsPerMeter:=0;
m_pBitmapInfo^.bmiHeader.biClrUsed:=0;
m_pBitmapInfo^.bmiHeader.biClrImportant:=0; SetLength(ppBuff,1);
ppBuff[0]:=m_pRawBuffer1; if HVSnapShot(HHV1, ppBuff, 1)=STATUS_OK then
begin
//将原始图像数据进行Bayer转换,转换后为24位。
//同时将原始数据进行上下翻转
ConvertBayer2Rgb(m_pImageBuffer1,
m_pRawBuffer1,
nWidth,
nHeight,
BAYER2RGB_NEIGHBOUR,
m_pLutR,m_pLutG,m_pLutB,
true,
BAYER_GR); //在视图客户区显示图像
PicDC:=GetDC(Cpic.Handle); StretchDIBits(PicDC,
0,0,
320,240,
0,0,
m_pBitmapInfo^.bmiHeader.biWidth,
m_pBitmapInfo^.bmiHeader.biHeight,
m_pImageBuffer1,
m_pBitmapInfo^,
DIB_RGB_COLORS,
SRCCOPY); ReleaseDC(Cpic.Handle,PicDC);
end;如果分辨率是640*480时无论保存图象还是实时显示都没有问题,如果分辨率是1024*768时保存没有问题,但StretchDIBits函数不再显示图象如果两个CCD同时在640*480下工作,象下面这样分配两组内存时,两个CCD都能正常保存图象,但只有一个CCD能实时显示。即用到m_pImageBuffer1的StretchDIBits能显示,而m_pImageBuffer2的StretchDIBits函数不显示
m_pRawBuffer1:=AllocMem(nWidth*nHeight);
m_pImageBuffer1:=AllocMem(nWidth*nHeight*3);
m_pRawBuffer2:=AllocMem(nWidth*nHeight);
m_pImageBuffer2:=AllocMem(nWidth*nHeight*3);但是只要去掉上面的一组内存,对应于两个CCD的StretchDIBits函数用同一组内存时又可以正常保存与显示。似乎是StretchDIBits函数只要访问比较大的地址的内存时就不再显示,这是什么原因??????
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货