#windows #bitmap #gdi #pixels
#Windows #растровое изображение #gdi #пиксель
Вопрос:
Я использовал множество других методов для чтения пиксельных данных из файлов, но мне показалось хорошей идеей попробовать использовать GDI. Документация немного расплывчата для неэкранных контроллеров домена, поэтому я как бы хватаюсь за соломинку.
Вот что у меня есть прямо сейчас, и в нем говорится, что все пиксели находятся за пределами (печатается ‘x’).
#include <windows.h>
#include <iostream>
using namespace std;
#define filename "test.bmp"
int main()
{
HBITMAP hBmp;
hBmp = (HBITMAP)LoadImage(NULL,(LPCTSTR)filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_SHARED);
if( hBmp==NULL )
{
cout<< "could not loadn";
system("pause");
return 0;
}
BITMAP bmp;
HDC hdc = CreateCompatibleDC(NULL);
GetObject(hBmp,sizeof(bmp),amp;bmp);
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);
for(int y=0;y<bmp.bmHeight;y )
{
for(int x=0;x<bmp.bmWidth;x )
{
if(x==0)
cout<< endl;
COLORREF clr;
clr = GetPixel(hdc,x,y);
if( clr != CLR_INVALID )
cout<< 0 (int)(clr==0);
else
cout<< 'x';
}
}
system("pause");
DeleteDC(hdc);
DeleteObject(hBmp);
return 0;
}
Ответ №1:
Вы должны выбрать растровое изображение для вашего dc:
HBITMAP hOldBmp = SelectObject(hdc, hBmp);
// I haven't understood what you're trying to achieve with this line of code
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdc,0,0,SRCCOPY);
....
SelectObject(hDc, hOldBmp);
DeleteDC(hdc);
....
Когда вы создаете memory dc, по умолчанию в нем выбирается растровое изображение размером 1×1.