2010-06-04 122 views
2

我使用CreateBitmap創建的位圖創建使用CreatePatternBrush的畫筆。CreatePatternBrush和屏幕顏色深度

位圖是1像素寬和24像素高,我有每個像素的RGB值,所以我創建了一個rgbquads數組並將其傳遞給CreateBitmap。

當屏幕顏色深度爲32bpp時,這很有效,因爲我創建的位圖也是32bpp。

當屏幕顏色深度不是32bpp時,這會失敗,我理解它爲什麼會這樣做,因爲我應該創建一個兼容的位圖。

看來我應該使用CreateCompatibleBitmap來代替,但是如何將像素數據放入該位圖?

我也讀到CreateDIBPatternBrushPt,CreateDIBitmap,CreateDIBSection等

我不明白什麼是一個DIBSection,並找到主題一般混亂。

我明白我需要一個與屏幕顏色深度相同的位圖,但是如何創建只有32bpp像素數據的位圖?

回答

2

您可以創建DIB,因爲您可以獨立於屏幕顏色深度使用與設備無關的位圖的。見CreateDIBSection()

你如何創建它只有32bpp像素數據? DIB可以用32bpp數據創建。正如你可以在文檔中寫着:

的CreateDIBSection函數創建 應用程序可以直接寫入 一個DIB。該函數爲您提供指向位圖位置 位值的指針 。 如果hSection爲NULL,則系統 會爲DIB分配內存。如果 函數成功,則返回值是 處理新創建的DIB,並且 * ppvBits指向位圖位值。

嘗試這樣:

VOID *ppvBits = NULL; 
BITMAPINFO BitmapInfo; 
memset(&BitmapInfo, 0, sizeof(BITMAPINFOHEADER)); 
BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
BitmapInfo.bmiHeader.biWidth = 1; 
BitmapInfo.bmiHeader.biHeight = 24; 
BitmapInfo.bmiHeader.biPlanes = 1; 
BitmapInfo.bmiHeader.biBitCount = 32; 
BitmapInfo.bmiHeader.biCompression = BI_RGB; 
HBITMAP hBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0); 

在我們的情況下,* ppvBits點至1 * 24 *(32/8)分配的字節。

重要的是要知道,如果biHeight是積極的,位圖是一個自下而上的DIB,它的原點是左下角。有關更多信息,請參閱BITMAPINFOHEADER Structure

+0

謝謝你的回答,真的。 在編寫任何代碼之前,我想了解幾件事情: BITMAPINFO是BITMAPINFO還是BITMAPINFOHEADER?我非常確定BITMAPINFO中的bmiColors是顏色表,我必須提供任何bmiColors或什麼? CreateDIBSection的iUsage參數:「包含在由pbmi(邏輯調色板索引或文字RGB值)指向的BITMAPINFO結構的bmiColors數組成員中的數據的類型。」 「DIB_RGB_COLORS:BITMAPINFO結構包含一個字面RGB值的數組。」 什麼數組字面RGB值? – 2010-06-09 04:52:48

+0

我猜我應該忽略bmiColors的東西,只是通過BITMAPINFOHEADER而不是BITMAPINFO,因爲這種情況是一個32位的位圖,並沒有顏色表。 但我不知道,如果我愚蠢或MSDN是非常混亂,或者兩者兼而有之。你認爲你可以點亮我嗎? – 2010-06-09 04:53:25

+0

在你的代碼中你忽略了bmiColors,所以我認爲我的推理是正確的。 – 2010-06-09 04:55:16

0

我使用CreateCompatibleBitmap和SetPixel解決了這個問題。不是我猜想的最佳選擇,但它有效。