请教:在16bit色深下如何显示256色位图失真最小?

zsx0521 2004-05-05 09:43:59
16bit为565格式时,我这样转换:
pal为256色位图中的调色板信息(RGBQUAD格式)
DWORD blue = pal[i].rgbBlue >> 3;
DWORD green = pal[i].rgbGreen>> 2;
DWORD red = pal[i].rgbRed >> 3;
colorValue[i] = (blue&0x1F) + ((green&0x3F)<<5) + ((red&0x1F)<<11);
显示好像色彩失真很大。

如果取各颜色最大值,再进行归一化,好像也是失真很大。
有没有简单的方法,可以使得失真最小啊?
...全文
60 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zsx0521 2004-05-08
你这样是直接截去了色彩的主要信息。是否误差会更大?
  • 打赏
  • 举报
回复
quace 2004-05-08
程序错了
DWORD blue = pal[i].rgbBlue;
DWORD green = pal[i].rgbGreen;
DWORD red = pal[i].rgbRed;
colorValue[i] = (blue&0x1F) + ((green&0x3F)<<5) + ((red&0x1F)<<11);
  • 打赏
  • 举报
回复
Swallowdeng_cq 2004-05-08
袁大侠说得对,错误无法避免因为数据已经损失了,不过how distribute the errors to neighbouring pixels
  • 打赏
  • 举报
回复
lambochan 2004-05-06
没办法..你这样直接右移转换就是砍尾...
唯一补救的方法是使用误差扩散..
按一定系数把“尾”分红、绿、蓝三通道扩散到右、下等相邻像素.

  • 打赏
  • 举报
回复
zsx0521 2004-05-06
我就是想找一个算法来解决这个问题啊!
  • 打赏
  • 举报
回复
FengYuanMSFT 2004-05-06
You can't avoid the error. Just use error diffusion algorithm to distribute the errors to neighbouring pixels.
  • 打赏
  • 举报
回复
zsx0521 2004-05-06
你的思路是不是平滑处理?
我看了WINDOWS本身在16bit色深下处理256色位图,色彩完全没有问题的。
  • 打赏
  • 举报
回复
lambochan 2004-05-05
为何要这样转换?use SetPixel()?
用LoadImage()不行么?
简单得很哦~~kaka
  • 打赏
  • 举报
回复
发帖
图形处理/算法

1.9w+

社区成员

VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
帖子事件
创建了帖子
2004-05-05 09:43
社区公告
暂无公告