2010-05-02 74 views
4

我有一個從磁盤加載的圖像(存儲爲BufferedImage),我在JPanel上正確顯示,但是當我嘗試使用下面的命令重新保存該圖像時,圖像以紅色色調保存。Java 1.5.0_16在保存jpg圖像時損壞了顏色

ImageIO.write(image, "jpg", fileName); 

注意!圖像是一個BufferedImagefileName是一個File對象指向將保存在「.jpg」中的文件名。

我已經讀過,在早期的JDK中有ImageIO方法存在問題,但我沒有找到那些版本中的其中一個。我正在尋找的是一種解決此問題而不更新JDK的方法,但是我已經說過,我仍然想知道JDK解決了哪個問題(如果它確實仍然是我使用的JDK的錯誤)。

謝謝。

+0

好吧,我發現一些更多的信息。我試圖保存圖像作爲PNG文件,顏色是正確的。所以這是jpg編碼器,似乎是不正確的。將圖片保存爲jpg文件對於我來說非常重要,因爲png文件很大。任何人有進一步的信息?是否有另一種機制將圖像保存爲jpg文件,可能是通過Toolkit? – Coder 2010-05-02 17:41:00

回答

5

好了,解決了我的問題,看來我需要將圖像轉換爲BufferedImage.TYPE_INT_RGB出於某種原因。我認爲alpha通道可能無法在某一層正確處理。

+0

很高興聽到您找到解決方案。如您所知,我建議在我的答案中更改緩衝圖像類型,但不知道圖像的具體細節,我無法確定哪種圖像類型可行。 – mdma 2010-05-02 21:17:42

+0

是的,再次感謝。我不確定整個投票是如何工作的(我是這個論壇的新手),如果這就是你的建議,但你有一分配給你的答案。我不知道這是一個好的地方,但這似乎適合放在這裏。正如我所說,我剛加入,但迄今爲止,我對這個社區的禮貌和反應如何印象深刻。很高興成爲它的一部分。 – Coder 2010-05-02 22:28:03

+0

+1獲得有用的反饋。我會敦促你接受@ mdma的答案,因爲它首先確定了潛在的問題。當然,你也可以對任何你認爲有用的答案進行投票。 – trashgod 2010-05-03 00:53:31

3

我會先調查是否是BifferedImage顏色模型是問題還是jpeg編碼。您可以嘗試更改圖像類型(constructor中的第三個參數),以查看是否會產生差異,並直接使用JPEGCodec保存jpeg。

E.g.

BufferedImage bufferedImage = ...; // your image 
out = new FileOutputStream (filename); 
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder (out); 
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam (bufferedImage); 
encoder.setJPEGEncodeParam (param); 
encoder.encode (bufferedImage); 
out.close(); 

編輯:改變文字,它是你想改變的圖像類型。請參閱構造函數的鏈接。

+0

感謝您的建議。 請問你能提供一些代碼片段嗎?如果直接使用編解碼器,你的意思是 Iterator writers = ImageIO.getImageWritersBySuffix(「jpeg」);,然後我已經試過了,這是相同的行爲。 – Coder 2010-05-02 14:32:34

+0

我的意思是使用上面的代碼片段將編碼保存到JPEG。 – mdma 2010-05-02 14:38:11

+0

再次感謝您,我嘗試了您的建議(完全複製您的代碼)並獲得相同的行爲。那麼這是否意味着編碼器是問題? – Coder 2010-05-02 14:49:06

1

另一種方法是將圖像渲染到緩衝區中,具有帶alpha的DirectColorModel,如下所述並建議here

private BufferedImage process(BufferedImage old) { 
    int w = old.getWidth(); 
    int h = old.getHeight(); 
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = img.createGraphics(); 
    g2d.drawImage(old, 0, 0, null); 
    g2d.dispose(); 
    return img; 
} 
+0

謝謝,試過你的方法,但它仍然是一樣的行爲。 – Coder 2010-05-02 16:43:00

+0

未能用於JavaFX將圖像另存爲jpg。 – Zon 2013-10-25 17:46:10