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赋值,结果,一弄,达到了预期的效果...........
昨天的晚上,为一个问题困扰了很长时间,几乎整个晚上都在弄一个小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图像格式。