работа с bitmap изображениями в mfc
Спасибо.
Здравствуйте. Сразу признаю, что с MFC знаком плохо, поэтому и обращаюсь в форум. Я создаю диалоговое mfc приложение, и мне необходимо загрузить bmp картинку в двумерный массив, произвести некоторую обработку изображения и вывести его в диалог. Интересует пример загрузки в 2d массив.
Спасибо.
Используй функцию CreateDIBSection,читай MSDN
Используй функцию CreateDIBSection,читай MSDN
Хотелось бы все-таки пример.
Хотелось бы все-таки пример.
int nweiDst=400; //ширина картинки в пикселях
int nheiDst=400; //высота картинки в пикселях
DWORD *arb; //Наш 2-х мерный массив котрый получится будет действителен после вызова CreateDIBSection и будет размером nweiDst на nheiDst
HWND hwdesc=GetDesktopWindow();
HDC hdesc=GetDC(hwdesc);
HDC hdc=CreateCompatibleDC(hdesc); //создаем основной контекст для прорисовки
ReleaseDC(hdesc,hwdesc);
BITMAPINFO bmi;
ZeroMemory(&bmi,sizeof(BITMAPINFO));
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=nweiDst;
bmi.bmiHeader.biHeight=-nheiDst;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=32;
bmi.bmiHeader.biCompression=BI_RGB;
HBITMAP hbm;
hbm=CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,(VOID**)&arb,0,0);
SelectObject(hdc,hbm);
//теперь кроме контекста доступен и 2-х мерный массив байтов arb
int nweiDst=400; //ширина картинки в пикселях
int nheiDst=400; //высота картинки в пикселях
DWORD *arb; //Наш 2-х мерный массив котрый получится будет действителен после вызова CreateDIBSection и будет размером nweiDst на nheiDst
HWND hwdesc=GetDesktopWindow();
HDC hdesc=GetDC(hwdesc);
HDC hdc=CreateCompatibleDC(hdesc); //создаем основной контекст для прорисовки
ReleaseDC(hdesc,hwdesc);
BITMAPINFO bmi;
ZeroMemory(&bmi,sizeof(BITMAPINFO));
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=nweiDst;
bmi.bmiHeader.biHeight=-nheiDst;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=32;
bmi.bmiHeader.biCompression=BI_RGB;
HBITMAP hbm;
hbm=CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,(VOID**)&arb,0,0);
SelectObject(hdc,hbm);
//теперь кроме контекста доступен и 2-х мерный массив байтов arb
Это конечно хорошо, но задача не создать изображения, а открыть уже существующие.
Это конечно хорошо, но задача не создать изображения, а открыть уже существующие.
Ну делаеш тоже самое что и выше,только ширину и высоту выбираеш с размер твоей картинки которую ты хочеш загрузить,затем грузиш картинку к примеру функцией LoadImage (здесь можно узнать и размер картинки). теперь у тя есть хэндл на картинку,блитиш его на только что созданную. Вот и все теперь 2-х мерный массив содержит нужную те картинку.
HBITMAP hbmn = (HBITMAP) LoadImage(0,"c:\\decrypt.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_DEFAULTSIZE);
BITMAP bm;
GetObject(hbmn,sizeof(bm),(LPVOID)&bm);
int nweiDst=bm.bmWidth; //ширина картинки в пикселях
int nheiDst=bm.bmHeight; //высота картинки в пикселях
DWORD *arb; //Наш 2-х мерный массив котрый получится будет действителен после вызова CreateDIBSection и будет размером nweiDst на nheiDst
HWND hwdesc=GetDesktopWindow();
HDC hdesc=GetDC(hwdesc);
HDC hdc=CreateCompatibleDC(hdesc); //создаем основной контекст для прорисовки
HDC hdct=CreateCompatibleDC(hdesc); //создаем временный контекст
ReleaseDC(hwdesc,hdesc);
SelectObject(hdct,hbmn);
BITMAPINFO bmi;
ZeroMemory(&bmi,sizeof(BITMAPINFO));
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth=nweiDst;
bmi.bmiHeader.biHeight=-nheiDst;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=32;
bmi.bmiHeader.biCompression=BI_RGB;
HBITMAP hbm;
hbm=CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,(VOID**)&arb,0,0);
SelectObject(hdc,hbm);
BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdct,0,0,SRCCOPY);
DeleteDC(hdct);
DeleteObject(hbmn);
//теперь тебе доступен hdc,arb и hbm. можеш выводить либо просто через hdc либо напрямую писать в arb
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_7zfp.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0c1f.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_99ir.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_5jhv.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp
и проч. ...
Спасибо. Роюсь в MSDN, вроде начал понимаать, что к чему. И последнее. Как Bitmap связать с каким-нмибудь DC чтобы, рисовать на bitmap линии и т. д.
На этот вопрос тебе уже ответили в предыдущих постах :
HWND hwdesc=GetDesktopWindow();
HDC hdesc=GetDC(hwdesc);
HDC hdc=CreateCompatibleDC(hdesc); //создаем основной контекст для прорисовки
HDC hdct=CreateCompatibleDC(hdesc); //создаем временный контекст
ReleaseDC(hwdesc,hdesc);
SelectObject(hdct,hbmn);