RGB和RGBQUAD的区别

来源:互联网 发布:广州聚友网络客服电话 编辑:程序博客网 时间:2024/06/17 03:17
原文地址:RGB和RGBQUAD的区别作者:nutch_bushu_java
 昨天的晚上,为一个问题困扰了很长时间,几乎整个晚上都在弄一个小bug,感觉没有问题,但就是效果不理想,几次三番,查来查去...........

       我想实现的功能是:生成一张图,图上有字,这张图是以一张指定的位图为背景的,我使用:
COLORREF GetPixel(
  HDChdc,    //handle to DC
  int nXPos,  // x-coordinate ofpixel
  int nYPos   //y-coordinate of pixel
);
   这个方法,读取了位图的颜色信息,然后使用:
int SetDIBits(
  HDChdc,                 // handle to DC
  HBITMAPhbmp,            // handle to bitmap
  UINTuStartScan,         // starting scan line
  UINTcScanLines,         // number of scan lines
  CONST VOID*lpvBits,     // array of bitmap bits
  CONST BITMAPINFO *lpbmi,  //bitmap data
  UINTfuColorUse          // 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(
  BYTEbyRed,    // redcomponent of color
  BYTE byGreen,  // greencomponent of color
  BYTEbyBlue    //blue component of color
);

从GetPixel函数里的返回值是: RGB,它的颜色顺序是: R,G,B.(红绿蓝),而:RGBQUAD的颜色顺序是:

B,G,R,Reserved(蓝绿红).得将RGB里的颜色变成BGR后,再给RGBQUAD赋值,结果,一弄,达到了预期的效果...........

       也许这也告诉了我:写程序要注意查阅文档,及细心地看明白吧!