Chinaunix首页 | 论坛 | 博客
  • 博客访问: 443324
  • 博文数量: 52
  • 博客积分: 3193
  • 博客等级: 中校
  • 技术积分: 860
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 09:58
文章分类

全部博文(52)

文章存档

2012年(1)

2011年(9)

2009年(18)

2008年(24)

我的朋友

分类: LINUX

2011-04-09 20:29:49

如何提取16bit bmp rgb颜色值
---摘自CSDN

如果是16位的BITMAPINFOHEADER类型的位图,
你需要检查BITMAPINFOHEADER结构的biCompression字段,
如果它的值是BI_BITFIELDS,则紧跟BITMAPINFOHEADER结构的后面是三个DWORD的值:
是三个32位颜色屏蔽值,第一个用于红色,第二个用于绿色,第三个用于蓝色。
(16位一般都是没的,32位有的可能性比较大)。
假设你是没的话,颜色值可以这样算:
C/C++ code
WORD wPixel;
for(i=0;i
{
  for(j=0;j
  {
     wPixel=*(WORD*)(pBmpBuf+i*lineByte+j*2);
     Red=  ((0x7C00 & wPixel) >> 10) << 3 ;
     Green=((0x03E0 & wPixel) >> 5 ) << 3 ; 
     Blue= ((0x001F & wPixel) >> 0 ) << 3 ;
  }
}


要看是什么格式的,16bit的有多种格式........
16位位图表示位图最多有2^16种颜色。每个色素用16位(2个字节)表示。这种格式叫作高
彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_R
GB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5
位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555
16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来
调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量
在16位中所占的位置。在Windows
95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码
分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x0
01F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分
量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码
之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接
近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。

Adobe PS 保存的16Bit Bmp图片使用的是555 16位位图
阅读(6417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~