RGB和RGBQUAD的区别
RGB和RGBQUAD的區別?
?昨天的晚上,為一個問題困擾了很長時間,幾乎整個晚上都在弄一個小bug,感覺沒有問題,但就是效果不理想,幾次三番,查來查去...........
? ? ? ? 我想實現的功能是:生成一張圖,圖上有字,這張圖是以一張指定的位圖為背景的,我使用:
COLORREF GetPixel(
? HDC hdc, ? ?// handle to DC
? int nXPos, ?// x-coordinate of pixel
? int nYPos ? // y-coordinate of pixel
);
? ?這個方法,讀取了位圖的顏色信息,然后使用:
int SetDIBits(
? HDC hdc, ? ? ? ? ? ? ? ? ?// handle to DC
? HBITMAP hbmp, ? ? ? ? ? ? // handle to bitmap
? UINT uStartScan, ? ? ? ? ?// starting scan line
? UINT cScanLines, ? ? ? ? ?// number of scan lines
? CONST VOID *lpvBits, ? ? ?// array of bitmap bits
? CONST BITMAPINFO *lpbmi, ?// bitmap data
? UINT fuColorUse ? ? ? ? ? // type of color indexes to use
);
方法,把顏色的信息寫到位圖里面去,結果生成的圖片,顯示出來,顏色總是不太對勁,一開始我猜想可能是24位的顏色和32位的顏色不太一樣,但后來,我左移試了,后移也試了,得到的顏色總是和理想的不太一樣,我調試,發現GetPixel這函數的返回值是一個DWORD,DWORD是32位的,按道理,應該顏色正確才對.但顯示出來的卻又不是.接著我又嘗試:讓加載的背景位圖,直接 ?BitBlt(dc, ?18, ? 18, ? WIDTH+18, ?HEIGHT+18, ? dcMem, ? 0, ? 0, ? SRCCOPY); ? 卻是能正確顯示出來.明顯是顏色信息有誤.
? ? 幾經思考,最后,發現了一個小細節:
typedef struct tagRGBQUAD {
? BYTE ? ?rgbBlue;
? BYTE ? ?rgbGreen;
? BYTE ? ?rgbRed;
? BYTE ? ?rgbReserved;
} RGBQUAD;
COLORREF RGB(
? BYTE byRed, ? ?// red component of color
? BYTE byGreen, ?// green component of color
? BYTE byBlue ? ?// blue component of color
);
從GetPixel函數里的返回值是: RGB,它的顏色順序是: R,G,B.(紅綠藍),而:RGBQUAD的顏色順序是:
B,G,R,Reserved(藍綠紅). 得將RGB里的顏色變成BGR后,再給RGBQUAD賦值,結果,一弄,達到了預期的效果...........
? ? ? ? 也許這也告訴了我:寫程序要注意查閱文檔,及細心地看明白吧!
?
BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。 由于BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。?
總結
以上是生活随笔為你收集整理的RGB和RGBQUAD的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代数字影视 电影使用标准
- 下一篇: H264白皮书