2014-01-11 68 views
4

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常量類型一致?

+0

我認爲這將有助於潛在的答覆者,如果你描述了什麼問題,你試圖解決這個信息... – haraldK

+0

@haraldK,這最初來自我的另一個問題,我想知道你是否可以確定原始圖像組成BufferedImage的文件格式。我自從發現.getType()方法似乎可能表明原始圖像類型,但我想要求澄清它的用法,因爲我嚴重懷疑這是一個可靠的指標(並且正如您的答案所表明的那樣是不是)。 – Thunderforge

+0

答案應該使一切變得清晰(最後可以說,這一切都取決於*解碼器*你接收的是什麼類型)。正如旁白:閱讀包含* 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

回答

7

[做]某些圖像類型總是導致BufferedImage與某些常數類型?

in your other question; 不,不存在BufferedImage類型與文件格式之間的直接關係。

或者是否有可能所有格式正確的圖像與所有BufferedImage常量類型相對應?

基本上是的。當然,如果轉換爲灰色,彩色圖像會丟失信息,如果每個採樣圖像轉換爲8位,則每個採樣圖像的16位會損失精度,等等。


然而,不同的文件格式具有存儲像素和顏色不同的方式,通常在一定BufferedImage型更緊密地代表在該文件格式中使用的「佈局」。

讓我們用你的GIF例如:

GIF格式的存儲「佈局」(應用LZW壓縮前)通常是最接近的TYPE_BYTE_INDEXED,使平時是「最便宜」的轉換中做Java的。對於多達16種顏色的GIF,TYPE_BYTE_BINARY也可以正常工作。而且,GIF始終可以解碼爲TYPE_4BYTE_ABGRTYPE_INT_ARGB(或者如果沒有透明色,則甚至可以將TYPE_3BYTE_BGRTYPE_INT_RGB解碼)。

換句話說,圖像的類型取決於解碼器,在某些情況下(如the ImageIO API)用戶。總之,您發現的是,默認情況下,ImageIO的GIF插件(GIFImageReader)會將具有16種以上顏色的GIF解碼爲TYPE_BYTE_INDEXED。使用不同的解碼器/框架可能會產生不同的結果。


歷史的一點點,可能啓發好奇的讀者:

類型的BufferedImage S其中不仿照對應的圖像格式。它們被建模爲與顯示硬件相對應。與顯示硬件具有相同像素佈局的圖像總是會更快顯示。其他佈局首先需要經過某種轉換。現代顯示硬件速度非常快,這當然不是什麼問題,但在「古代」時代這很重要。順便提一句,許多「古老的」圖像格式是特別創建的,或者是針對在特定顯示硬件上運行的特定應用程序創建的。因此,顯示硬件的像素佈局經常以文件格式使用。再一次,因爲不需要轉換,而且它是最快/最簡單的實現。

所以,是的,有一種關係。這不是直接的「給定A => B」關係,而是「給定A C => B」。

+0

所以爲了澄清,gif至少總是會導致某種類型的BufferedImage,而PNG可以是幾乎所有類型的? – Thunderforge

+1

不,BufferedImage類型和文件格式之間沒有直接關係。 – haraldK

+0

我很困惑。你說過,GIF的存儲「佈局」是「TYPE_BYTE_INDEXED」的存儲「佈局」。這不是兩者之間的關係嗎?或者我們使用不同的關係定義? – Thunderforge

相關問題