使用Windows GDI将24位颜色转换为索引颜色,即使在提供的调色板中存在完全匹配,GDI也会选择"足够接近"的颜色.
任何人都可以确认这是一个GDI问题,还是我在某处犯了错误?
也许有一个"请检查整个调色板的颜色匹配"标志,我找不到?
注意:这与量化无关.源是24位但包含256或更少的颜色,因此精确的调色板很容易计算.问题是GDI没有使用完整的调色板.
我通过自己绘制颜色来解决这个问题,但是我更喜欢使用GDI,因为它应该更好地进行优化.问题是,它似乎"快而错".
我的源图像是24位,但使用256(或更少)颜色.我为它生成一个精确的调色板,并要求GDI使用该调色板将图像传输到索引位图.对于某些像素,即使在调色板中的其他位置存在确切的颜色,GDI也会选择相似但不精确的颜色.这会破坏平滑的渐变.
出现此问题:
这个问题不是没有与发生:
我测试了这个:
在每次测试中,我都得到相同的结果.(不只是错误的颜色,但总是相同的错误颜色.)
我不认为问题是色彩管理(ICM/ICC配置文件/等),因为大多数API都说他们没有使用它,我已经尝试在GDI DC以及V5上明确地将其关闭位图标题,我认为它不适用于我的vanlilla-Win2k VM.
可在此处找到简单Win32/GDI/VS2008测试项目的代码:
http://www.pretentiousname.com/data/GdiIndexColor.zip
Win32UI.cpp中的Test1函数是实际测试.它有两个RGBQUAD数组,一个是源图像,另一个是精确的调色板.它验证调色板确实是准确的,然后要求GDI使用上面提到的API转换图像,每次测试结果.对于每个测试,它会告诉您颜色前后的第一个不正确的像素,或者告诉您所有像素都是正确的.
感谢您阅读我的问题!对不起,如果这是我做一些非常愚蠢的事情的结果!:-)
小智 5
我遇到了这个完全相同的问题,最终联系了微软并为他们提供了一个测试案例.在测试用例中,我提供了一个24位DIB中有128种颜色的渐变图像,然后我将其转换为8bit DIB,该DIB是使用包含24位图像中所有128种颜色的颜色表创建的.转换后,8位图像仅使用了128种颜色中的65种.
总结一下他们的回答:这不是一个错误,GDI在向下转换图像的颜色深度时确实使用了足够接近的计算.这在任何地方都没有真正记录,确保所有原始颜色确切转换的唯一方法是自己手动操作像素.
归档时间: |
|
查看次数: |
1423 次 |
最近记录: |