2013-04-09 63 views
4

這裏沒有重複的問題,因爲我一直在Google和StackOverflow中搜索解決方案很長一段時間,但仍找不到解決方案。如何使用Java將JPEG圖像讀入BufferedImage對象

我有這兩個圖像:

Larger Image

Smaller Image

這些都是來自同一個網站用相同的前綴,格式相同的兩個圖像。唯一的區別是尺寸:第一個更大,而第二個更小。

我將這兩個圖像下載到本地文件夾,並使用Java將它們讀入BufferedImage對象。但是,當我將BufferedImages輸出到本地文件時,我發現第一張圖像幾乎是紅色,而第二張圖像是正常的(與原始圖像相同)。我的代碼有什麼問題? PS:我用GIMP打開第一張圖像並檢測到色彩模式是'sRGB',沒有alpha或其他東西。

+1

EMM,你選擇一個漂亮的照片我喜歡你的味道:) 我不知道什麼是顏色的問題,但嘗試這個 'BufferedImage的IMG = ImageIO.read(new File(「path/to/image」));' – Azad 2013-04-09 06:55:26

+0

其實,我試過了,但是失敗了...... – victorunique 2013-04-09 07:04:31

+0

[用紅色面具創建的java緩衝圖像](http:// stackoverflow.com/questions/12963685/java-buffered-image-created-with-red-mask) – haraldK 2016-05-19 09:27:34

回答

9

這顯然是一個知道的錯誤,我看到了幾個建議(this是一個),建議使用Toolkit#createImage來代替,這顯然忽略了顏色模型。

我測試了這個,它似乎工作正常。

public class TestImageIO01 { 

    public static void main(String[] args) { 
     try { 
      Image in = Toolkit.getDefaultToolkit().createImage("C:\\hold\\test\\13652375852388.jpg"); 

      JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(in)), "Yeah", JOptionPane.INFORMATION_MESSAGE); 

      BufferedImage out = new BufferedImage(in.getWidth(null), in.getHeight(null), BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = out.createGraphics(); 
      g2d.drawImage(in, 0, 0, null); 
      g2d.dispose(); 

      ImageIO.write(out, "jpg", new File("C:\\hold\\test\\Test01.jpg")); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

nb-我用JOptionPane來驗證傳入的圖像。當使用ImageIO它帶有紅色色調,Toolkit它看起來很好。

更新

而一個explantation

+0

謝謝。有用。 – victorunique 2013-04-09 07:46:34

0

我檢查在NetBeans你的代碼,面對你的問題,然後我改變了代碼如下有沒有問題:

public class Test { 

    public static void main(String args[]) throws IOException { 


     byte[] rawData = getRawBytesFromFile(imageFilePath); // some code to read raw bytes from image file 
//  ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(rawData)); 
//  BufferedImage img = ImageIO.read(iis); 
     FileOutputStream fos = new FileOutputStream(outputImagePath, false); 
     fos.write(rawData); 
//  ImageIO.write(img, "JPEG", fos); 
     fos.flush(); 
     fos.close(); 
    } 

    private static byte[] getRawBytesFromFile(String path) throws FileNotFoundException, IOException { 

     byte[] image; 
     File file = new File(path); 
     image = new byte[(int)file.length()]; 

     FileInputStream fileInputStream = new FileInputStream(file); 
     fileInputStream.read(image); 

     return image; 
    } 
} 

請檢查並通知我結果的;)

祝你好運

+0

感謝您的回覆更重要的是,當它複製圖像文件時,它確實有效。但是,您知道,我需要將圖像文件讀入BufferedImage對象以進行進一步處理(如旋轉或縮放),所以這不是解決此問題的方法。 – victorunique 2013-04-09 07:23:07

+0

我使用Photoshop將圖像格式更改爲PNG,然後將png文件更改爲JPEG。新的jpg文件一切正常。 [這是](http://postimg.org/image/b7y5hh9qf/)新圖像。 – 2013-04-09 07:49:37

+0

是的,就像@MadProgrammer說的那樣,它是ImageIO的一個bug,它無法讀取某種類型的JPEG。當您使用PS將其重新保存爲標準JPEG時,問題就解決了。 – victorunique 2013-04-09 07:58:56

相關問題