Java中的BufferedImage類包含一個getType()
方法,該方法返回一個與BufferedImage常量類型變量相關的整數,該變量描述有關圖像編碼方式的一些信息(您可以查看BufferedImage source以確定哪些數字對應於哪個常量類型變量)。例如,如果它返回與BufferedImage.TYPE_3BYTE_BGR
相對應的整數,那麼這意味着BufferedImage是一個8位的RGB圖像,沒有alpha,藍色,綠色和黃色,每個圖像用3位表示。某些圖像文件類型是否總是與某些BufferedImage常量類型相對應?
其中一些圖像類型似乎與特定格式的某些屬性相關聯。例如,TYPE_BYTE_INDEXED
表示它是從「256色6/6/6色立方體調色板」創建的。這聽起來很像GIF圖像,它是從256色創建的。
好奇的是,我在我的硬盤上掃描了幾百張照片,並使用ImageIO.read(File file)
將它們轉換爲BufferedImage,然後在其上調用BufferedImage.getType()
。我確定只有幾種從某些圖像類型生成的BufferedImage類型。結果如下:
JPG: TYPE_3BYTE_BGR,TYPE_BYTE_GRAY
PNG: TYPE_3BYTE_BGR,TYPE_BYTE_GRAY,TYPE_4BYTE_BGRA
GIF: TYPE_BYTE_INDEXED
雖然它看起來像兩個JPG文件, PNG共享一些類似的BufferedImage常量類型,在我的測試中只有一個PNG導致了TYPE_4BYTE_BGRA
,每個GIF導致了TYPE_BYTE_INDEXED
。
我對圖像格式不太熟悉,確實我的樣本量並不是那麼大。所以我想我會問:假設一個圖像格式正確,某些圖像類型總是會導致帶有某些常量類型的BufferedImages?舉一個具體的例子,格式正確的GIF圖像總是對應於TYPE_BYTE_INDEXED
?還是有可能所有格式正確的圖像都與所有的BufferedImage常量類型一致?
我認爲這將有助於潛在的答覆者,如果你描述了什麼問題,你試圖解決這個信息... – haraldK
@haraldK,這最初來自我的另一個問題,我想知道你是否可以確定原始圖像組成BufferedImage的文件格式。我自從發現.getType()方法似乎可能表明原始圖像類型,但我想要求澄清它的用法,因爲我嚴重懷疑這是一個可靠的指標(並且正如您的答案所表明的那樣是不是)。 – Thunderforge
答案應該使一切變得清晰(最後可以說,這一切都取決於*解碼器*你接收的是什麼類型)。正如旁白:閱讀包含* transparency *的PNG文件通常會導致TYPE_CUSTOM類型,它不會告訴你任何東西。也許更重要的是:當你想*繪製*加載的圖像時,你應該考慮將它們轉換爲'TYPE_INT_ARGB',因爲對於其他類型,繪畫可能會非常慢。另請參閱http://stackoverflow.com/questions/22391353/get-color-of-each-pixel-of-an-image-using-bufferedimages/22391951#22391951 – Marco13