熟悉StretchDIBits API函数的朋友请进。 ( 积分: 200 )

  • 主题发起人 主题发起人 人生如路
  • 开始时间 开始时间

人生如路

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的方法是否正确?是否有参数设置错了?

这个烂虫困扰了小弟很久了,请大家帮帮忙,先谢了。
 
一个采集程序,调用采集卡提供的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的方法是否正确?是否有参数设置错了?

这个烂虫困扰了小弟很久了,请大家帮帮忙,先谢了。
 
在线等待。。。。。
 
在线等待。。。。。
 
呵呵 老路 好久不见,大概看了一下 看不出那里会报地址错误。那个函数偶没用过,但是既然能正常工作参数就应该不会错误。 建议加个记录 每执行一个关键语句就记录一下 写到日志文件 等异常后 查看日志文件 对比几次后就可以找到问题了。
 
mmzmagic:多谢,我想有可能是有一两个参数设置错了,比如Size什么的,因为它关系到API进行内存操作,而错误提示就是“地址访问冲突”。。。。

另:请问你是哪位啊?我知道你应该是在CTC里面,不过我记不得这个ID是哪位的了。
 
我刚才加了日志试了一下,出错的时候,根据日志中的记录,是执行完了过程再出错的。即是说到了end的时候出的错。

这样怪怪的错也很常见,一般都是因为某些不当的指针操作引起的。如果是一般的代码,要找出来不会太麻烦,不过这个代码中的BUG我找了很久了,还是没有找出来。。而且,最主要的是这个API我第一次用,不知道调用的时候是否把参数设置错了(最重要的,应该是BitmapInfo结构)。

哪位给点提示,感激涕零!
 
请大家在有空的前题下,花上一点点时间,帮小弟看看,先谢了。

另外,http://www.delphibbs.com/delphibbs/dispq.asp?lid=3060432一贴是由小弟自行解决,它的分将加在此贴上。
 
又没人解决。

自己搞定了。分又没法给。
 
哎,现在没有要问的问题,分怎么办。。
 
有些细节的问题,其他人很难帮得上忙,除非是一个办公室的同事.因为它没有你的环境,没办法,只能说一些没劲却是真理的办法,就像你的电脑不亮了,那么建议你检查电源是否插了一样
 
呵。。我知道。

我是说,我的问题搞定了,不知道分怎么办。要不,给你吧,要不要??
 
分给我吧,好久没得过分了:(

(SizeOf(TRGBQUAD) * 255); --- 这个东东出现了两次,怎么没有检测到呢?
 
不是那个问题。

你要分,就要回我的问题哦。。。
 
老路好抠门啊~ [:D]
 
呵呵.人兄倒是个认真的人.
 
来自:zjan521, 时间:2005-8-5 12:19:32, ID:3157409
呵呵.人兄倒是个认真的人.
====多谢,多谢。

来自:刘麻子, 时间:2005-8-4 19:26:59, ID:3156572
老路好抠门啊~ [:D]
=====麻麻,小心我扁你哦。你听听群众的声音,我可是一个认真的人哦。

要不要分嘛?嘻。。
 
噫,没有人要分了呢。。。。
 
谢谢您的参与大富翁论坛。问题处理结果如下:

您的注释已经被接受

给 cqbaobao 发出了Email通知信息。

返回
===========================哈哈,baobao你这样关心我这个问题啊。
 
难道又又我的分?[:D][:D]
 
后退
顶部