2015-10-08 53 views
1

我有圖像,有System.Drawing.Imaging.PixelFormat.Format1bppIndexed(在Windows資源管理器文件屬性中查看)。爲什麼PixelFormat是Format32bppArgb,但圖像有Format1bppIndexed

但加載文件後,看到Format32bppArgb

string path = "cat.png"; 
using (var bitmap = new System.Drawing.Bitmap(path)) 
{ 
    // bitmap.PixelFormat == Format32bppArgb, but must Format1bppIndexed 
} 

可能是什麼問題呢?

測試圖像1http://i.stack.imgur.com/r2HGH.png
測試圖像2http://i.stack.imgur.com/xUgEy.png

UPD
嘗試使用構造

// useIcm: 
//  true to use color correction for this System.Drawing.Bitmap; otherwise, false. 
Bitmap(string filename, bool useIcm); 

測試圖像1裝載的成功,但測試圖像2有Format32bppArgb

+0

圖像編解碼器不需要告訴你任何關於文件的像素格式。 PNG編解碼器在這裏做的很好,1bppIndexed是一種非常尷尬的格式,與所有索引格式一樣,不支持基本的圖像處理,並將其轉換爲視頻適配器格式非常慢。 32bppArgb沒有這樣的問題。 –

回答

0

當您運行Bitmap構造函數時,它會解析圖像文件並將其加載到對象中。你看到的不是該文件的PixelFormat,而是該對象的PixelFormat。構造函數在內部將格式轉換爲Format32bppArgb

+1

但我有其他類似的文件,其中PixelFormat == Format1bppIndexed加載後。如何用文件格式強制加載? – Ildar

0

原始圖像的像素格式是什麼並不重要。它取決於解碼器是否保留原始像素格式。如果您確實想將雙色圖像轉換爲1 bpp格式,請參閱我的回答here中的ConvertPixelFormat方法。

0

這是.Net框架中的一個錯誤;它似乎有透明度在調色板PNG圖像上的工作方式的問題。

看到,調色板級別的plet圖片實際上完全是alpha-capable。 png文件具有特定的額外塊(「tRNS」塊),可以添加該塊以定義每個調色板條目的阿爾法。不知何故,當遇到這種情況時,.Net框架正確地應用了這個alpha,但是堅持將圖像視爲32bppARGB。

這是很奇怪的,因爲它完全支持調色板上的阿爾法在這樣認爲的,其實可以保存文件一樣,沒有任何問題。

特別奇怪的是,您在那裏的文件實際上並沒有在其調色板上具有透明度; 「tRNS」塊將所有調色板條目定義爲100%不透明。但似乎只有大塊就夠了。

解決方法是將png加載到字節數組中,讀取並剪切包含透明度數據的「tRNS」塊,以便.Net框架保留索引格式,並從流創建的流中加載圖像後編輯後的字節數組,使用讀取的「tRNS」數據對調色板進行後處理以應用alpha。

完整的代碼做的是張貼在這樣的回答:

A: How to read 8-bit PNG image as 8-bit PNG image only?

順便說,巴新塊的分析表明,該第二圖像實際上是一個位每像素圖像,用調色板256色。不知道你是如何管理的。