摘要
使用Windows GDI將24位顏色轉換爲索引顏色,看起來GDI選擇的顏色「足夠接近」,即使在提供的調色板中有精確的匹配。GDI無法使用精確的調色板轉換爲索引顏色?
任何人都可以證實這是一個GDI問題,或者我在某個地方犯了一個錯誤嗎?
也許有一個「請檢查顏色匹配的整個調色板」標誌,我沒有找到?
注意:這是關於量化的而不是。源代碼是24位的,但包含256或更少的顏色,因此精確的調色板計算起來微不足道。問題是GDI不使用完整的調色板。
解決方法
我解決此問題通過映射的顏色自己的工作,但我寧願使用GDI所應當更好地優化。問題是,它似乎是「快但錯了」。
詳述
我的源圖像是24位,但使用256(或更少)的顏色。我爲它生成了一個精確的調色板,並要求GDI使用該調色板將圖像轉換爲索引位圖。對於某些像素,即使在調色板的其他地方有精確的顏色,GDI也會選擇相似但不是精確的顏色。這破壞了平滑的漸變。
此問題發生:
- 的SetDIBitsToDevice
- 的StretchDIBits
- 的BitBlt
- StretchBlt
這個問題不是不的發生是:
- SetPixel或SetPixelV在一個循環(!令人難以置信的慢)
- 使用自己的代碼進行映射
我已經在測試這一點:
- 的Windows 7(英偉達硬件/驅動程序)
- 的Windows Vista(ATI硬件/驅動器)
- 的Windows 2000(VMware的硬件/驅動器)
在每次測試中我都得到相同的結果。 (不只是錯誤的顏色,但總是錯誤的顏色。)
我不認爲問題是顏色管理(ICM/ICC配置文件/等),因爲大多數的API說他們不使用它,我試過在GDI DC上以及通過V5位圖標題明確地關閉它,我認爲它不適用於我的vanlilla-Win2k VM。
測試項目
代碼一個簡單的Win32/GDI/VS2008的測試項目可以在這裏找到:
http://www.pretentiousname.com/data/GdiIndexColor.zip
內Win32UI.cpp的Test1的功能是實際測試。它有兩個RGBQUADs數組,一個是源圖像,另一個是精確的調色板。它驗證調色板確實是確切的,然後要求GDI使用上面提到的API轉換圖像,每次測試結果。對於每個測試,它會告訴你顏色之後&之前的第一個不正確的像素,或者告訴你所有像素在工作時都是正確的。
謝謝!
感謝您閱讀我的問題!對不起,如果這是我做一些非常愚蠢的事情的結果! :-)
+1的答案似乎是正確的。這個問題已經有一年多的時間了,但它仍然可以幫助未來的人。 – casablanca 2010-11-12 14:50:57
謝謝里斯!令人失望的是要知道這是怎麼回事,但知道我沒有做錯什麼是很好的。 – 2010-11-12 16:18:22