人
人生如路
Unregistered / Unconfirmed
GUEST, unregistred user!
一个采集程序,调用采集卡提供的SDK进行工作,在采集的时候,提供回调函数,在回调函数中进行相关处理。小弟的回调函数并没有做很复杂的处理,只是简单的把Buffer中的图显示出来,因为有可能视频源的分辨率很大(可能比1024 X 768还大),此因需要缩放以后再显示,部分代码如下:
==========================================================================
{前面读取bits数据的代码略过,经过测试,前面的代码没有问题。}
//缩放BlickInfo
BitmapInfoSize := SizeOf(TBitmapInfoHeader) + 4 + (SizeOf(TRGBQUAD) * 255);
GetMem(BMPInfo, BitmapInfoSize);
FillChar(BMPInfo^, BitmapInfoSize, 0);
with BMPInfo^ do
begin
bmiHeader.biWidth := BufferRect.Right - BufferRect.Left ;//iDisplayWidth;
bmiHeader.biHeight := BufferRect.Bottom - BufferRect.Top;//iDisplayHeight;
//bmiHeader.biSize := SizeOf(TBitmapInfo) + (SizeOf(TRGBQUAD) * 255);
bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
bmiHeader.biPlanes := 1;
bmiHeader.biBitCount := 8;
bmiHeader.biSizeImage := 0;
bmiHeader.biCompression := BI_RGB;
bmiHeader.biXPelsPerMeter := 0;
bmiHeader.biYPelsPerMeter := 0;
bmiHeader.biClrUsed := 0;
bmiHeader.biClrImportant := 0;
for I := 0 to 255 do
begin
bmiColors.rgbBlue := I;
bmiColors.rgbGreen := I;
bmiColors.rgbRed := I;
bmiColors.rgbReserved := 0;
end;
end;
windows.GetClientRect(DisplayWnd, DestRect);
DestRect.Left := (DestRect.Right - iDisplayWidth) div 2;
DestRect.Top := (DestRect.Bottom - iDisplayHeight) div 2;
DestRect.Right := iDisplayWidth;
DestRect.Bottom := iDisplayHeight;
SetStretchBltMode(Cap2F.Canvas.Handle , STRETCH_DELETESCANS);
try
Cap2F.Canvas.Lock;
StretchDIBits(OKCap2F.Canvas.Handle,
DestRect.Left,
DestRect.Top,
DestRect.Right,
DestRect.Bottom,
BufferRect.Left,
BufferRect.Top,
BufferRect.Right,
BufferRect.Bottom,
PBits,
BMPInfo^,
DIB_RGB_COLORS,
SRCCOPY);
finally
Cap2F.Canvas.Unlock;
end;
FreeMem(BMPInfo, BitmapInfoSize);
========================================================================
上面的代码很简单,首先为BitmapInfo和灰度图调色板申请一块内存,再设置BitmapInfo结构,再设置调色板,再设置目标区域大小,最后调用API进行缩放,并画到Form画布上。
现在的现像是:采集程序能正常工作,而且在回调函数中输出正确的、缩放后的图像,不过,过不了几分钟,就出现一个“地址访问冲突”的错误。
请问:小弟使用StretchDIBits的方法是否正确?是否有参数设置错了?
这个烂虫困扰了小弟很久了,请大家帮帮忙,先谢了。
==========================================================================
{前面读取bits数据的代码略过,经过测试,前面的代码没有问题。}
//缩放BlickInfo
BitmapInfoSize := SizeOf(TBitmapInfoHeader) + 4 + (SizeOf(TRGBQUAD) * 255);
GetMem(BMPInfo, BitmapInfoSize);
FillChar(BMPInfo^, BitmapInfoSize, 0);
with BMPInfo^ do
begin
bmiHeader.biWidth := BufferRect.Right - BufferRect.Left ;//iDisplayWidth;
bmiHeader.biHeight := BufferRect.Bottom - BufferRect.Top;//iDisplayHeight;
//bmiHeader.biSize := SizeOf(TBitmapInfo) + (SizeOf(TRGBQUAD) * 255);
bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
bmiHeader.biPlanes := 1;
bmiHeader.biBitCount := 8;
bmiHeader.biSizeImage := 0;
bmiHeader.biCompression := BI_RGB;
bmiHeader.biXPelsPerMeter := 0;
bmiHeader.biYPelsPerMeter := 0;
bmiHeader.biClrUsed := 0;
bmiHeader.biClrImportant := 0;
for I := 0 to 255 do
begin
bmiColors.rgbBlue := I;
bmiColors.rgbGreen := I;
bmiColors.rgbRed := I;
bmiColors.rgbReserved := 0;
end;
end;
windows.GetClientRect(DisplayWnd, DestRect);
DestRect.Left := (DestRect.Right - iDisplayWidth) div 2;
DestRect.Top := (DestRect.Bottom - iDisplayHeight) div 2;
DestRect.Right := iDisplayWidth;
DestRect.Bottom := iDisplayHeight;
SetStretchBltMode(Cap2F.Canvas.Handle , STRETCH_DELETESCANS);
try
Cap2F.Canvas.Lock;
StretchDIBits(OKCap2F.Canvas.Handle,
DestRect.Left,
DestRect.Top,
DestRect.Right,
DestRect.Bottom,
BufferRect.Left,
BufferRect.Top,
BufferRect.Right,
BufferRect.Bottom,
PBits,
BMPInfo^,
DIB_RGB_COLORS,
SRCCOPY);
finally
Cap2F.Canvas.Unlock;
end;
FreeMem(BMPInfo, BitmapInfoSize);
========================================================================
上面的代码很简单,首先为BitmapInfo和灰度图调色板申请一块内存,再设置BitmapInfo结构,再设置调色板,再设置目标区域大小,最后调用API进行缩放,并画到Form画布上。
现在的现像是:采集程序能正常工作,而且在回调函数中输出正确的、缩放后的图像,不过,过不了几分钟,就出现一个“地址访问冲突”的错误。
请问:小弟使用StretchDIBits的方法是否正确?是否有参数设置错了?
这个烂虫困扰了小弟很久了,请大家帮帮忙,先谢了。