16位位图颜色转化问题

luojxun 2012-04-06 11:44:59
16位位图biCompression = 0.那么应该是555格式,取得两个字节,byte0(低位)byte1(高位)
使用掩码
r = byte1 & 0x7C >> 2;
g = (byte1 & 0x03 << 3) | (byte0 & 0xE0 >> 5);
b = byte0 & 0x1F;
颜色不正确,是算法不正确?

直接使用这两个字节得到的颜色,整个图片偏蓝色。有哪位知道是什么问题吗?
...全文
151 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luojxun 2012-04-07
  • 打赏
  • 举报
回复
感谢回复,结贴吧。
luojxun 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

这是转换宏
C/C++ code

#define RGB555toRGB(rgb555) ((DWORD)(((BYTE)(((rgb555)>>7)&0xF8)|((WORD)((BYTE)(((rgb555)>>2)&0xF8))<<8))|(((DWORD)(BYTE)(((rgb555)<<3)&0xF8))<<16)))
[/Quote]
在biCompression = BI_BITFIELDS时才有掩码。这个宏我试了一下好像不对。
而且这个宏
(rgb555)>>7&0xF8
(rgb555)>>2&0xF8
(rgb555)<<3&0xF8
好像没道理。
icemornings 2012-04-06
  • 打赏
  • 举报
回复
这是转换宏

#define RGB555toRGB(rgb555) ((DWORD)(((BYTE)(((rgb555)>>7)&0xF8)|((WORD)((BYTE)(((rgb555)>>2)&0xF8))<<8))|(((DWORD)(BYTE)(((rgb555)<<3)&0xF8))<<16)))
icemornings 2012-04-06
  • 打赏
  • 举报
回复
是的,16位转24位需要一个掩码计算,我找一下
[Quote=引用 8 楼 的回复:]

看来16位转24位要通过某种算法补充一些颜色信息才行。
[/Quote]
luojxun 2012-04-06
  • 打赏
  • 举报
回复
看来16位转24位要通过某种算法补充一些颜色信息才行。
luojxun 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:

参考一下这里:http://www.kalytta.com/bitmap.h

m_BitmapData[Index].Red = ((Color >> 10) & 0x1f) << 3;
m_BitmapData[Index].Green = ((Color >> 5) & 0x1f) << 3;
m_BitmapData[Index].……
[/Quote]
直接用是不对的,一个范围是255一个是31,这样整个图片是偏暗的。
luojxun 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

参考一下这里:http://www.kalytta.com/bitmap.h
[/Quote]
m_BitmapData[Index].Red = ((Color >> 10) & 0x1f) << 3;
m_BitmapData[Index].Green = ((Color >> 5) & 0x1f) << 3;
m_BitmapData[Index].Blue = (Color & 0x1f) << 3;
这个算法我试过,将24位转16位就是取高5位,这个是逆运算,不知道为什么颜色偏黄。
满衣兄 2012-04-06
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/17423.htm
RGB555
  RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
  高字节 低字节
  X R R R R R G G G G G B B B B B (X表示不用,可以忽略)
  可以组合使用屏蔽字和移位操作来得到RGB各分量的值:
  #define RGB555_MASK_RED 0x7C00
  #define RGB555_MASK_GREEN 0x03E0
  #define RGB555_MASK_BLUE 0x001F
  R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
  G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
  B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31
luojxun 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

参考一下这里:http://www.kalytta.com/bitmap.h
[/Quote]
感谢,我研究一下,呵呵。
luojxun 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

RGB的顺序可能颠倒了,换成B=...,G=...,R=...,试试
[/Quote]
首先格式不对,r是高位,而且我已试过了,不对。
ryfdizuo 2012-04-06
  • 打赏
  • 举报
回复
参考一下这里:http://www.kalytta.com/bitmap.h
TopsLuo 2012-04-06
  • 打赏
  • 举报
回复
RGB的顺序可能颠倒了,换成B=...,G=...,R=...,试试

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧