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的区别)