hephi 发表于 2012-10-26 00:28:05

视频采集卡执行StretchBlt将图像放大一点,出现画面静止现象

开发环境:c++ Builder 6.0
Graphics::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仿真循环加载多个图像显示并放大是没有问题的,我觉得还是跟取视频采集卡数据有关系

各路高手帮忙分析一下啊!

hephi 发表于 2012-10-26 00:32:58

公布取图像代码
//自定义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);
    }
}

hephi 发表于 2012-10-26 00:34:32

另外窗体已设置了
Form1->DoubleBuffered = true;
所以图片是不闪烁的
页: [1]
查看完整版本: 视频采集卡执行StretchBlt将图像放大一点,出现画面静止现象