Как правильно воссоздать BITMAP, который ранее использовался CreateFileMapping ()? - PullRequest
1 голос
/ 22 марта 2010

Дорогие друзья, мне нужна ваша помощь.

Мне нужно отправить файл .bmp другому процессу (диалоговое окно) и отобразить его там, используя MMF (Memory Mapped File) Но проблема в том, что изображение отображается в перевернутом цвете и вверх ногами.

Вот исходный код:

В первом приложении я открываю изображение с жесткого диска и связываю его с именем MMF "Gigabyte_picture"

HANDLE hFile = CreateFile("123.bmp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, "Gigabyte_picture");

Во втором приложении я открываю сопоставленный файл bmp и в конце отображаю m_HBitmap на статическом компоненте, используя функцию SendMessage.

HANDLE hMappedFile = OpenFileMapping(FILE_MAP_READ, FALSE, "Gigabyte_picture");
PBYTE pbData = (PBYTE) MapViewOfFile(hMappedFile, FILE_MAP_READ, 0, 0, 0); 

BITMAPINFO bmpInfo = { 0 };
LONG lBmpSize = 60608; // size of the bmp file in bytes

bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biHeight = 174;
bmpInfo.bmiHeader.biWidth = 87;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biSizeImage = lBmpSize;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);               

UINT * pPixels = 0;    
HDC hDC = CreateCompatibleDC(NULL);

HBITMAP m_HBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void **)& pPixels, NULL, 0);                               
SetBitmapBits(m_HBitmap, lBmpSize, pbData);
SendMessage(gStaticBox, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM)m_HBitmap);
/////////////
HWND gStaticBox = CreateWindowEx(0, "STATIC","",
SS_CENTERIMAGE | SS_REALSIZEIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE,
10,10,380, 380, myDialog, (HMENU)-1,NULL,NULL);

Ответы [ 2 ]

0 голосов
/ 22 марта 2010

Я отредактировал код, и теперь он работает нормально (цвета изображения правильные, изображение НЕ перевернуто)

SetBitmapBits(m_HBitmap, lBmpSize, pbFile + 54);

BITMAP bm;              
GetObject(m_HBitmap, sizeof(BITMAP), (LPSTR)&bm);

// this code rotate picture on 180 degrees on Y axis
HDC TempHDC = ::CreateCompatibleDC(NULL);
HBITMAP hOldBitmap2 = (HBITMAP)SelectObject(TempHDC, m_HBitmap);

::StretchBlt(TempHDC,0,0, bm.bmWidth, bm.bmHeight, TempHDC,  0,  bm.bmHeight-1, bm.bmWidth,-bm.bmHeight, SRCCOPY ); 
SelectObject(TempHDC,hOldBitmap2);
DeleteDC(TempHDC);

// as before
SendMessage(gStaticBox, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM)m_HBitmap);
0 голосов
/ 22 марта 2010

pbData указывает на начало данных растрового изображения, которое указывает на заголовок растрового изображения. Дайте SetBitmapBits указатель на необработанные данные: pbData + размер заголовка + необязательный поддон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...