Java 讀取jpeg圖片 Unsupported Image Type 異常

使用Java的ImageIO做一些圖片處理的工作,突然今天有人反饋說我的程序無法處理jpg圖片。我拿到圖片進行調試,出現瞭如下報錯:

 

javax.imageio.IIOException: Unsupported Image Type

       at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)

       at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)

       at javax.imageio.ImageIO.read(Unknown Source)

       at javax.imageio.ImageIO.read(Unknown Source)

       at com.dancen.util.image.MyImageHelper.getBufferedImage(MyImageHelper.java:554)

 

也就是說,這個jpg圖片被認爲是不支持的圖片類型,然而,程序卻能夠正常處理其它的jpg圖片。

難道這個圖片不是一張jpg圖片?使用系統自帶的圖片瀏覽工具、使用瀏覽器都能正常顯示該圖片;而且該文件的文件頭FFD8FF確實也表明這就是一張jpg圖片。

 

問題原因:

Java的ImageIO萬年不更新,已經跟不上時代,它不能處理CMYK色彩的圖片。如果在PS等軟件中導出CMYK顏色模式的圖片,Java自帶的ImageIO是不支持的。

 

解決辦法:

TwelveMonkeys項目:https://github.com/haraldk/TwelveMonkeys

TwelveMonkeys ImageIO is a collection of plugins and extensions for Java's ImageIO.

 

These plugins extends the number of image file formats supported in Java, using the javax.imageio.* package. The main purpose of this project is to provide support for formats not covered by the JRE itself.

 

Support for formats is important, both to be able to read data found "in the wild", as well as to maintain access to data in legacy formats. Because there is lots of legacy data out there, we see the need for open implementations of readers for popular formats. The goal is to create a set of efficient and robust ImageIO plug-ins, that can be distributed independently.

 

TwelveMonkeys ImageIO是Java ImageIO的擴展,在使用上非常方便,直接導入相關的jar包依賴即可,不需要在原有代碼上進行修改,代碼上層依然使用的是Java的ImageIO。

 

附:RGB色彩和CMYK色彩的區別和換算

RGB色彩

 

自然界中絕大部分的可見光譜可以用紅、綠和藍三色光按不同比例和強度的混合來表示。RGB分別代表着3種顏色:R代表紅色,G代表綠色、B代表藍色。RGB模型也稱爲加色模型,通常用於光照、視頻和屏幕圖像編輯。RGB色彩模式使用RGB模型爲圖像中每一個像素的RGB分量分配一個0~255範圍內的強度值。

 

CMYK色彩

 

CMYK色彩模式以打印油墨在紙張上的光線吸收特性爲基礎,圖像中每個像素都是由靛青(C)、品紅(M)、黃(Y)和黑(K)色按照不同的比例合成。每個像素的每種印刷油墨會被分配一個百分比值,最亮(高光)的顏色分配較低的印刷油墨顏色百分比值,較暗(暗調)的顏色分配較高的百分比值。

 

CMYK轉RGB的換算方法

 

R = 255*(100-C)*(100-K)/10000

G = 255*(100-M)*(100-K)/10000

B = 255*(100-Y)*(100-K)/10000

1

2

3

RGB轉CMYK的換算方法

這個轉換理論上是不存在的,主要是因爲K值的存在。當k=0時的公式爲:

C = 100 - R * 100 / 255

M = 100 - G * 100 / 255

Y = 100 - B * 100 / 255

 

發佈了82 篇原創文章 · 獲贊 61 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章