Чтение растрового изображения и отображение диапазона в диалоге - PullRequest
0 голосов
/ 03 ноября 2011

Проблема: невозможно вывести изображение на экран ... ??Я ищу методологию, с помощью которой я могу работать с камеры, и файл, в котором я могу изменить растровое изображение, используя GetDIBits и SetDIBits, и записать его на экран.

Так далеко от файла до экрана ... нетрабочая

HDC hdcScreen;
HDC hdcWindow;
HDC hdcMemDC = NULL;
HBITMAP hbmScreen = NULL;
BITMAP bmpScreen;

BITMAPFILEHEADER   bmfHeader;    
BITMAPINFOHEADER   bi;
BITMAPINFO bif;




// Retrieve the handle to a display device context for the client 
// area of the window. 
hdcScreen = ::GetDC(NULL);
// hdcWindow = ::GetDC(hWndC);

// Create a compatible DC which is used in a BitBlt from the window DC
hdcMemDC = CreateCompatibleDC(hdcWindow); 

HANDLE hFile = ::CreateFile("c:\\captureqwsx.bmp",
    GENERIC_READ,
    0,
    NULL,
    OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL, NULL);   


DWORD nBytesRead = 0;
ReadFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &nBytesRead, NULL);
ReadFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &nBytesRead, NULL);
//HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize); 
char *lpbitmap;// = (char *)GlobalLock(hDIB); 
DWORD dwBmpSize;// = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;
ReadFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &nBytesRead, NULL);




//Close the handle for the file that was created
CloseHandle(hFile);



//CRect rect;
//GetClientRect(&rect);

bif.bmiHeader = bi;

HDC hDC = hdcWindow;


HBITMAP hBitmap;
HDC hMemDC;

hBitmap = CreateCompatibleBitmap(hDC, bi.biWidth, bi.biHeight);
hMemDC = CreateCompatibleDC(hDC);
SetDIBits(hDC, hBitmap, 0, bi.biHeight, lpbitmap, &bif, DIB_RGB_COLORS);
SelectObject(hMemDC, hBitmap);
BitBlt(hDC, 0, 0, bi.biWidth, bi.biHeight, hMemDC, 0, 0, SRCCOPY);

DeleteObject(SelectObject(hMemDC, hBitmap));
DeleteDC(hMemDC);

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Здесь вы получаете DC для всего экрана.Это то, что вы действительно хотите?

GetDC(NULL);

Возможно, вам следует удалить это и раскомментировать следующую строку:

// hdcWindow = ::GetDC(hWndC); 

Согласно опубликованному примеру, вы вызываете CreateCompatibleDC () с неинициализированным 'Аргумент hdcWindow.

hdcMemDC = CreateCompatibleDC(hdcWindow);

После прочтения BITMAPFILEHEADER и BITMAPINFOHEADER вы должны переместить указатель файла в BITMAPFILEHEADER :: bfOffBits offest.Затем вы должны вызвать ReadFile (), чтобы прочитать само растровое изображение.Кстати, требуемый размер буфера находится в BITMAPINFOHEADER :: biSizeImage.

Поскольку hdcWindow неинициализирован, hDC также остается неинициализированным:

hDC = hdcWindow;

Проверяли ли вы возвращаемое значение SetDIBits ()?

Попробуйте изменить следующую строку:

hOldBitmap = SelectObject(hMemDC, hBitmap);

Затем, после BitBlt ():

DeleteObject(SelectObject(hMemDC, hOldBitmap));

Я не знаю, является ли это окончательным решением вашей проблемы, но это начало.

1 голос
/ 09 ноября 2011
        dcMem.DeleteDC();
        hbmScreen = CreateCompatibleBitmap(dc, m_rectFrame2.right-m_rectFrame2.left, m_rectFrame2.bottom-m_rectFrame2.top);// <-- needed
        dcMem.CreateCompatibleDC(&dc);
        hbmScreen = (HBITMAP)LoadImage(NULL, _T("c:\\captureqwsx.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
   //for setDiBits    
    SetDIBits(hdcWindow, hbmScreen, 0,  
                  (UINT)bmpScreen.bmHeight,
                  lpbitmap,  
                  (BITMAPINFO *)&bi, DIB_RGB_COLORS);
        dcMem.SelectObject(hbmScreen);
        dc.StretchBlt( 
                   m_rectFrame2.left, m_rectFrame2.top, 
                   m_rectFrame2.right-m_rectFrame2.left,//GetSystemMetrics (SM_CXSCREEN),
                   m_rectFrame2.bottom-m_rectFrame2.top,//GetSystemMetrics (SM_CYSCREEN),
                   &dcMem, 
                   0,0,
                   m_rectFrame2.right-m_rectFrame2.left,//GetSystemMetrics (SM_CXSCREEN),
                   m_rectFrame2.bottom-m_rectFrame2.top,//GetSystemMetrics (SM_CYSCREEN),
                   SRCCOPY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...