用红色掩码创建的java缓冲图像

我在阅读图像时遇到问题。 如果我做以下事情

URL url = new URL("http://sofzh.miximages.com/java/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(); 

图像用红色调写成。 是否有一些选项需要设置才能正确读取此图像?

问题可能与无法正确读取某些JPG图像的ImageIO.read有关。 这是一个类似的错误 (错误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(); } } } 

结果如下:

在此处输入图像描述

抱歉。 我没有为什么有红色调的答案。

这就是我们在软件中读取图像的方式。 在我们的例子中,我们使用标量库来调整图像大小。

 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); 
 BufferedImage bi = ImageIO.read( "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg" ); ImageIO.write( bi, 'JPEG', new File( "badimage.jpeg" ); 
 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(很可能)包含一个bug。 它不会产生红色图像。 但我不确定BufferedImage第三个参数中的色彩空间。

正如其他答案中所提到的,这是与ImageIO和Oracle JRE捆绑在一起的标准JPEG插件中的一个已知错误。

但是,通过使用TwelveMonkeys ImageIO JPEG插件替换JPEG插件,可以继续使用OP的原始代码中的ImageIO 。 您只需要将JAR及其依赖项添加到运行时类路径中。 无需更改代码(我使用OP的测试文件进行了测试)。

该插件特别适用于解决标准JPEG插件的许多问题。 它支持CMYK JPEG,破坏的ICC配置文件,Exif数据等。 该插件由我开发,可以在开源BSD许可下自由分发。

以下是使用imageIO的变通方法whitout的Java Servlet示例:

 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(); }