2012-10-18 42 views
3

我無法讀取圖像創建。如果我做了以下java的緩衝圖像與紅色面具

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
ImageInputStream stream = ImageIO.createImageInputStream(url.openStream()); 
ImageReader reader = ImageIO.getImageReaders(stream).next(); 
reader.setInput(stream, true, true); 
BufferedImage image = reader.read(0); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 
ImageOutputStream ios = ImageIO.createImageOutputStream(bos); 
writer.setOutput(ios); 
IIOImage ioImage = new IIOImage(image, null, null); 
writer.write(ioImage); 
ios.close(); 
FileOutputStream fos = new FileOutputStream("badimage.jpeg"); 
fos.write(bos.toByteArray()); 
fos.close(); 

圖像寫入一個紅色的色調。是否有一些選項需要設置爲正確讀取此圖像?

+2

看一看[Java中奇數彩色JPEG圖片與ImageIO的(http://blog.idrsolutions.com/2009/04 /奇數有色JPEG文件功能於Java的與-的ImageIO /)。我聽說過幾次,但從未遇到過這個問題,我使用PNG – MadProgrammer

回答

5

該問題可能與ImageIO.read無法正確讀取某些JPG圖片有關。以下是類似的bug(錯誤ID:4881314),可能仍有部分未解決。

作爲替代你可以嘗試使用Toolkit.createImage似乎正確處理指定的圖像。例如:

import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

class TestImage { 
    public static void main(String args[]) { 
     try { 
      URL imageUrl = new URL(
       "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
      BufferedImage ioImage = ImageIO.read(imageUrl); 
      Image toolkitImage = Toolkit.getDefaultToolkit().createImage(
        imageUrl); 

      JPanel panel = new JPanel(); 
      panel.add(new JLabel(new ImageIcon(ioImage))); 
      panel.add(new JLabel(new ImageIcon(toolkitImage))); 

      JOptionPane.showMessageDialog(null, panel, "ImageIO vs Toolkit", 
        JOptionPane.INFORMATION_MESSAGE); 

     } catch (Exception e) { 
      JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", 
        JOptionPane.ERROR_MESSAGE); 
      e.printStackTrace(); 
     } 
    } 
} 

下面是結果:

enter image description here

0
BufferedImage bi = 
    ImageIO.read(
     "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
ImageIO.write(bi, 'JPEG', new File("badimage.jpeg"); 
1

對不起。我沒有答案,爲什麼有一個紅色的色彩。

這是我們如何閱讀我們的軟件映像。 在我們的例子中,我們使用標量庫來調整圖像大小。

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
BufferedImage source = javax.imageio.ImageIO.read(url); 
BufferedImage manipulated = ... 
FileOutputStream fos = new FileOutputStream("badimage.jpeg"); 
javax.imageio.ImageIO.write(manipulated , "png", fos); 
0
ImageIcon mySourceImage = new ImageIcon(sourceImageFile.getAbsolutePath()); 
BufferedImage sourceImage = new BufferedImage(mySourceImage.getIconWidth(), mySourceImage.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR); 
Graphics2D g2d2 = (Graphics2D) sourceImage.getGraphics(); 
mySourceImage.paintIcon(null, g2d2, 0, 0); 
g2d2.dispose(); 

上面的代碼不使用Image.read它(頗有可能)包含一個錯誤。它不會產生紅色圖像。但是我不確定關於BufferedImage第三個參數中的色彩空間。

0

正如在其他的答案中提到,這是在自帶的ImageIO和Oracle JRE捆綁的標準JPEG插件一個已知的bug。

然而,有可能繼續使用的ImageIO作爲OP的原代碼,通過與TwelveMonkeys ImageIO JPEG plugin取代JPEG插件。您只需將JAR及其依賴項添加到運行時類路徑中。無需更改代碼(我使用OP的測試文件進行了測試)。

插件特別作出解決或修復與標準JPEG插件的許多問題。它支持CMYK JPEG,破碎的ICC配置文件,Exif數據等等。該插件由我開發,可以在開放源代碼BSD許可下自由分發。

0

這裏是一個Java Servlet的示例使用ImageIO的whitout一個解決方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    //TestImage 
    String testImage = "UNC Path or URL.jpg";//Load your image here... 

    //Get the streams 
    FileInputStream inStream = new FileInputStream(testImage); 
    ServletOutputStream outStream = response.getOutputStream(); 

    //Create the buffers 
    BufferedInputStream inBuf = new BufferedInputStream(inStream); 
    BufferedOutputStream outBuf = new BufferedOutputStream(outStream); 

    //Write input into output 
    int ch =0; ; 
    while((ch=inBuf.read())!=-1) 
     outBuf.write(ch); 

    inBuf.close(); 
    inStream.close(); 
    outBuf.close(); 
    outStream.close(); 
}