Проблема с использованием GetDIBits ()

следующий код, который использует GetDIBits (), не дает мне желаемого результата:

#include <windows.h>
#include <iostream>
using namespace std;
int main() {int i; HDC MemDC=CreateCompatibleDC(NULL);
HBITMAP hBit=(HBITMAP)LoadImage(NULL,(LPCTSTR)"F:\\gBit.bmp",IMAGE_BITMAP,1366,768,LR_CREATEDIBSECTION);
SelectObject(MemDC,hBit);BITMAPINFO bmi;
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=1366;
bmi.bmiHeader.biHeight=1;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=24;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biXPelsPerMeter=0;
bmi.bmiHeader.biYPelsPerMeter=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;BYTE p[3*1366];
GetDIBits(MemDC,hBit,500,1,p,&bmi,DIB_RGB_COLORS); //My screen width is 1366 and I want to get the pixels of the 500th line
for (i=0; i<3*1366; i+=3) {cout<<p[i]<<endl;}
DeleteObject(hBit);
ReleaseDC(NULL,MemDC); DeleteDC(MemDC);
}

(gBit.bmp — это полностью растровое изображение размером 1366×768).

Я новичок в C ++ и почти не знаю, как использовать эту функцию. Я ожидал, что p [i] будет 255 для всех i, больших или равных 0 и меньших или равных 3 * 1366, поскольку каждый пиксель gBit является белым, но отображаются случайные значения, большинство из которых равно 0. Я не использую эту функцию должным образом или ошибка где-то еще?

РЕДАКТИРОВАТЬ: Кажется, что GetDIBits () не удается сохранить данные пикселей в p, так как те же значения возвращаются, когда я удаляю строку, содержащую GetDIBits (). На этот раз я не выбрал hBit в DC. В чем еще может быть проблема?

0

Решение

Документы MSFT утверждают, что: «Растровое изображение, определенное параметром hbmp, не должно выбираться в контексте устройства, когда приложение вызывает эту функцию». (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx).
Это может быть частью проблемы.

Также обратите внимание, что вы не должны звонить DeleteObject на растровом изображении все еще выбран в DC.

0

Другие решения

Попробуйте изменить третий аргумент функции BitBlt на 0 (я не совсем уверен, почему он равен 500, поскольку ваше растровое изображение состоит только из одной строки развертки).

Также обратите внимание, что, поскольку 24-битные растровые изображения выровнены по DWORD (последние неиспользуемые байты заполнены 0), каждая строка сканирования занимает кратное четыре байта, поэтому размер вашего файла на самом деле не 1366 * 3, а 1368 * 3.

0

Даже если вам нужна только одна строка, вам все равно нужно установить полную высоту в структуре BITMAPINFO:

bmi.bmiHeader.biHeight=768;
0
По вопросам рекламы [email protected]