2010-03-22 17 views
1

親愛的朋友,我需要你的幫助。如何正確地重新創建之前由CreateFileMapping()共享的BITMAP?

我需要發送.bmp文件到另一個進程(對話框),並使用MMF(內存映射文件) 顯示它。但問題是圖像顯示反向顏色和顛倒。

這裏的源代碼:

在第一個應用程序,我從硬盤打開圖片,並將其鏈接到名爲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文件,並在年底我使用SendMessage函數在靜態組件上顯示m_HBitmap。

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); 
+0

一個問題:SetBitmapBits拷貝位,據我所知。你知道一種方法來防止複製並創建一個直接使用pbData中的位的位圖嗎? – 2010-03-30 14:36:00

回答

0

pbData指向開始位圖數據,指向位圖頭。 給SetBitmapBits指向原始數據的指針:pbData +標題大小+可選的pallete。

+0

是的。你是對的。我已經閱讀了BMP格式規範,並將pbData指向右邊的54個字節,並且圖片的顏色變得正確。 – zim22 2010-03-22 20:11:51

0

我編輯的代碼,而現在它工作正常(圖片顏色是否正確,圖像不顛倒)

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); 
相關問題