关于DIB位图和DDB位图的问题

wh_peng 2009-12-17 05:17:26
我用CreateDIBSection得到一个DIB位图(是8位的位图),然后我直接就可以显示出来,并没有设置

调色板,这里我就有点纳闷了,书上不是说对于DIB位图,输出一幅之前不是要将其逻辑调色板选入

到相关的设备上下文并实现到系统调色板中的吗?对于什么情况下才要设置调色板啊?
比较理解这方面的大侠,来解释下啊,谢谢了!
...全文
147 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh_peng 2009-12-21
  • 打赏
  • 举报
回复
当显示时,系统会作DIB->DDB的转换,由于系统是高发色数,能显示所有颜色,因此,8bit或以下的bmp使用位数据(实际上那是index)to色彩表映射时,能正确地映射所有的颜色而无须要实现调色板.
-------------------------------------------------------------------------------------
显示8bit或以下的bmp时,要是设备DC没选择调色板的话,是不是就默认用系统的啊?要是这样的话,系统调色板的序号跟位图自己的调色板的序号应该不一样吧?那这样的话,位图的颜色表的索引能映射到正确
的颜色吗?
wh_peng 2009-12-21
  • 打赏
  • 举报
回复
谢谢lambochan的耐心指导
lambochan 2009-12-21
  • 打赏
  • 举报
回复
系统显示你的8 bit(or low)dib过程,可以抽象理解为:
1: get u dib index
2: search u colors table
3: setpixel( x, y, RGB( index.r, index.g, index.b ) );
明显地,现在的系统所有RGB(XXX,XXX,XXX)都能显示,你说还用不用什么垃圾调色板之类的..

古老的就如这样:
1: get u dib index
2: search u colors table
3: setpixel( x, y, RGB( nearindex.r, nearindex.g, nearindex.b ) );
3a: nearindex = find_index_in20Colors(index); // 不实现调色板
3b: nearindex = find_index_in256Palette(index); // 实现调色板

ok..不明白也没办法了,hoho. 3帖.byebye~
lambochan 2009-12-21
  • 打赏
  • 举报
回复
这就是为什么:
"我用CreateDIBSection得到一个DIB位图(是8位的位图),然后我直接就可以显示出来,并没有设置"
的原因.

你可以试试把你的程序右键->属性->兼容性->用256色运行打钩,估计效果就完全不一样了.
lambochan 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wh_peng 的回复:]
显示8bit或以下的bmp时,要是设备DC没选择调色板的话,是不是就默认用系统的啊?要是这样的话,系统调色板的序号跟位图自己的调色板的序号应该不一样吧?那这样的话,位图的颜色表的索引能映射到正确
的颜色吗?
[/Quote]
这个是DDB转换过程.系统根据位数据index去search lut( colors table ),然后把这个在lut里的颜色显示到屏幕.
这个过程你明显可以看出:由于系统可以显示所有颜色,因此根本不需要实现调色板来显示lut里某一种颜色.

说了N次:调色板只是系统发色数在<=256色下正确显示颜色的一种手段(例如win3.x/win95之类的古老系统)
当做ddb转换时,系统根据位数据index去search lut( colors table ),然后把这个在lut里的颜色显示到屏幕.
这个过程你明显可以看出:由于古老系统只能正确显示内置的20种颜色,不实现调色板的话,所有lut里的颜色将会用这20种颜色来映射,换言之,将不会显示正确的颜色.

lambochan 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wh_peng 的回复:]
但是对于低于或者等于8位的位图来说,颜色表是映射到调色板的啊,设备DC没有选择到该调色板,又怎么能正确显示该位图呢?
[/Quote]

当显示时,系统会作DIB->DDB的转换,由于系统是高发色数,能显示所有颜色,因此,8bit或以下的bmp使用位数据(实际上那是index)to色彩表映射时,能正确地映射所有的颜色而无须要实现调色板.
相反,在低发色数系统上(256or以下),由于系统只能正确显示系统自带的20种颜色,假如不实现调色板,是无法正确把bmiColors[x]里的颜色正确映射的.也就是说,显示时只会用系统自带的20种色来map(如不实现调色板)DIB的bmiColors[x],所以颜色就变成古古怪怪.
假如还不清楚的话,就去看看相关书籍/msdn或者自己动手实现一下, good luck
wh_peng 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lambochan 的回复:]
引用楼主 wh_peng 的回复:
我用CreateDIBSection得到一个DIB位图(是8位的位图),然后我直接就可以显示出来,并没有设置

调色板,这里我就有点纳闷了,书上不是说对于DIB位图,输出一幅之前不是要将其逻辑调色板选入

到相关的设备上下文并实现到系统调色板中的吗?对于什么情况下才要设置调色板啊?
比较理解这方面的大侠,来解释下啊,谢谢了!


调色板只是在发色数等于或低于256色系统上能正确显示颜色的一种手段.
对于现在的系统来说,显示系统基本上都是16Bit或以上,可以说,不需要实现调色板也能正确显示颜色.
至于那些要实现调色板的书籍或代码是比较负责的,考虑到向后兼容的问题,如果不实现调色板,那么在256色系统(或更低)会死得很难看的.

可以测试一下:
右键击你的程序,兼容性选择256色,然后运行,看看不实现调色板时,能否正确显示颜色~~~
估计99%的流行代码都会死得很惭..
大名鼎鼎如CxImage demo..一样死翘翘,因为并没在win下实现调色板(也许认为不需要向后兼容).
[/Quote]
但是对于低于或者等于8位的位图来说,颜色表是映射到调色板的啊,设备DC没有选择到该调色板,又怎么能正确显示该位图呢?
lambochan 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 wh_peng 的回复:]
我用CreateDIBSection得到一个DIB位图(是8位的位图),然后我直接就可以显示出来,并没有设置

调色板,这里我就有点纳闷了,书上不是说对于DIB位图,输出一幅之前不是要将其逻辑调色板选入

到相关的设备上下文并实现到系统调色板中的吗?对于什么情况下才要设置调色板啊?
比较理解这方面的大侠,来解释下啊,谢谢了!
[/Quote]

调色板只是在发色数等于或低于256色系统上能正确显示颜色的一种手段.
对于现在的系统来说,显示系统基本上都是16Bit或以上,可以说,不需要实现调色板也能正确显示颜色.
至于那些要实现调色板的书籍或代码是比较负责的,考虑到向后兼容的问题,如果不实现调色板,那么在256色系统(或更低)会死得很难看的.

可以测试一下:
右键击你的程序,兼容性选择256色,然后运行,看看不实现调色板时,能否正确显示颜色~~~
估计99%的流行代码都会死得很惭..
大名鼎鼎如CxImage demo..一样死翘翘,因为并没在win下实现调色板(也许认为不需要向后兼容).

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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