视频采集卡执行StretchBlt将图像放大一点,出现画面静止现象
开发环境:c++ Builder 6.0Graphics::TBitmap *BmpRec=new Graphics::TBitmap();
Graphics::TBitmap *BmpDisplay=new Graphics::TBitmap();
从SDK2000视频采集卡取图像放入BmpRec,可以将源图像直接正常显示在Image1上。
但是一旦执行StretchBlt将图像放大一点,然后鼠标移动到Image1上,就会出现画面静止现象,什么原因呢?
StretchBlt(BmpDisplay->Canvas->Handle,0,0,480,360,
BmpRec->Canvas->Handle,0,0,320,240,SRCCOPY);
Form1->Image1->Picture->Bitmap->Assign(BmpDisplay);
我还试过用StretchDraw来图像放大,可是问题依旧
BmpDisplay->Canvas->StretchDraw(Rect(0,0,480,360),BmpTemp);
有人说DIB没刷到,我测试过了,StretchBlt耗时才2ms
目前的帧率是26,我降低帧率问题依旧,只要执行StretchBlt就会出现这种现象,
画面有时候就停在那里。
我新建一个Graphics::TBitmap *BmpTemp=new Graphics::TBitmap();
BmpTemp->Assign(BmpRec);
执行StretchBlt将BmpTemp放大,画面不会静止了,但是会闪动,闪动瞬间画面是无图像的。
我用Timer1仿真循环加载多个图像显示并放大是没有问题的,我觉得还是跟取视频采集卡数据有关系
各路高手帮忙分析一下啊! 公布取图像代码
//自定义DIP位图信息头结构体
typedef union
{
char pDIBHead;
BITMAPINFO sBITMAPINFO;
}uBITMAPINFO;
uBITMAPINFO m_BITMAPINFO;
void __stdcall GetDIBStream(const BYTE* pDIBHead, const BYTE* pDIBits, LPVOID pParam)
{
int i,j;
rec_flag = false;
for(i = 0;i < 40;i++)
{
m_BITMAPINFO.pDIBHead = *(pDIBHead + i);
}
/*if(m_BITMAPINFO.sBITMAPINFO.bmiHeader.biBitCount == 8) //8位位图
{
BmpRec->PixelFormat = pf8bit;//此处需根据位图信息头而定
}
else if(m_BITMAPINFO.sBITMAPINFO.bmiHeader.biBitCount == 24) //24位位图
{
BmpRec->PixelFormat = pf24bit;//此处需根据位图信息头而定
}
else if(m_BITMAPINFO.sBITMAPINFO.bmiHeader.biBitCount == 32) //32位位图
{
BmpRec->PixelFormat = pf32bit;//此处需根据位图信息头而定
}*/
BmpRec->PixelFormat = pf24bit;
BmpRec->HandleType = bmDIB;
BmpRec->Width = m_BITMAPINFO.sBITMAPINFO.bmiHeader.biWidth;//320;
BmpRec->Height = m_BITMAPINFO.sBITMAPINFO.bmiHeader.biHeight;//240;
Byte *ptr; //定义指向Bmp->ScanLine的指针
for(i = BmpRec->Height - 1;i > 0;i--)//高,数据存储上下颠倒
{
ptr=(Byte*)BmpRec->ScanLine;
for(j = 0;j < BmpRec->Width;j++) //宽
{
ptr = *pDIBits++;
ptr = *pDIBits++;
ptr = *pDIBits++;
pDIBits++;
}
}
//Form1->Image1->Picture->Bitmap->Assign(BmpRec);
if(display_flag)
{
//将图片放大显示
//BmpDisplay->Canvas->StretchDraw(Rect(0,0,N_WIDTH,N_HEIGHT),BmpRec);
StretchBlt(BmpDisplay->Canvas->Handle,0,0,N_WIDTH,N_HEIGHT,
BmpRec->Canvas->Handle,0,0,O_WIDTH,O_HEIGHT,SRCCOPY);
Form1->Image1->Picture->Bitmap->Assign(BmpDisplay);
}
} 另外窗体已设置了
Form1->DoubleBuffered = true;
所以图片是不闪烁的
页:
[1]