现在的位置: 首页 > 综合 > 正文

Camera raw data directly to image using CxImage

2013年05月22日 ⁄ 综合 ⁄ 共 2426字 ⁄ 字号 评论关闭

http://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/2408d395-5c57-494c-bb3c-ba4c15512c05

Hello!

I'm having a problem with BitBlt in my application.

I capture the frames of a webcam and display them with BitBlt directly on the main window. But after a few minutes the drawing stops, although the capturing is still running (i'm saving each 10th image in order to check that). 
So the images are not drawn anymore after some time, and even the Windows "picture and fax viewer" does not work anymore when this problem occurs. 

The capturing runs in an own thread and each time a new frame is taken it is directly painted on the screen to get a live stream of the camera:

if(VI.isFrameNew(device1))
{
  hdc1 = GetDC(hWnd);
  imageBuffer = VI.getPixels(device1, false, false);
  cxImage.CreateFromArray((BYTE*)imageBuffer, VI.getWidth(device1), VI.getHeight(device1), 24, VI.getWidth(device1)*3, false);

  bmp = cxImage.MakeBitmap(hdc1);
  hdcMem = CreateCompatibleDC(hdc1);
  hBitmapPrev = (HBITMAP)SelectObject(hdcMem, bmp);

  BitBlt(hdc1, 20, 40, VI.getWidth(device1), VI.getHeight(device1), hdcMem, 0, 0, SRCCOPY);
  SelectObject(hdcMem, hBitmapPrev);
            
  DeleteDC(hdcMem); 
  DeleteDC(hdc1);
  imageBuffer = NULL;
}

Could you please tell me if I'm making any mistake in this code or if the problem is somewhere else?

Thanks in advance,
Daniel

-------------------------------------
I don't know if this is the source of your error, but you should "ReleaseDC(hdc1)"

See the documentation of DeleteDC at the msdn.

Hope this helps.
------------------------
Thanks for your reply.

But actually I was using ReleaseDC,i forgot to post this part of the code.

Here is the whole Thread-Method:

DWORD WINAPI ThreadProc( LPVOID pvoid ) 
{ 
    HDC hdc1, hdcMem;
    HBITMAP    bmp, hBitmapPrev;
    CxImage    cxImage;
    unsigned char* imageBuffer;    //Here is the camera image stored

    while(true)
    {
        hdc1 = GetDC(hWnd);
        if(VI.isFrameNew(device1))
        {
            imageBuffer = VI.getPixels(device1, false, false);
            cxImage.CreateFromArray((BYTE*)imageBuffer, VI.getWidth(device1), VI.getHeight(device1), 24, VI.getWidth(device1)*3, false);

            bmp = cxImage.MakeBitmap(hdc1);
            hdcMem = CreateCompatibleDC(hdc1);
            hBitmapPrev = (HBITMAP)SelectObject(hdcMem, bmp);

            BitBlt(hdc1, 20, 40, VI.getWidth(device1), VI.getHeight(device1), hdcMem, 0, 0, SRCCOPY);
            SelectObject(hdcMem, hBitmapPrev);
            
            DeleteDC(hdcMem);
            DeleteDC(hdc1);
            imageBuffer = NULL;
        }
        ReleaseDC(hWnd, hdcMem);
        ReleaseDC(hWnd, hdc1);
    }
    return 0;
}


Any other ideas about a possible reason for my problem?

Thanks a lot,
Daniel

EDIT: I could solve it now. My mistake was i didn't delete the Bitmaps. By adding

DeleteObject(bmp);
DeleteObject(hBitmapPrev);

everything works fine now.

Thanks a lot, alex! Your idea with releasing resources made me remember that I have to delete these objects too :-)

抱歉!评论已关闭.