使用ImageIO.write jpg文件的问题

我使用下面的代码来写一个jpg文件:

String url="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; String to="D:/temp/result.jpg"; ImageIO.write(ImageIO.read(new URL(url)),"jpg", new File(to)); 

但我得到的结果是一个粉红色的背景图像:

替代文字

如何解决这个问题? 你可以给我一些示例代码? (在J2SE库中)

感谢帮助 :)

您可以通过使用Toolkit.createImage(url)而不是ImageIO.read(url)来解决此问题,该ImageIO.read(url)使用不同的解码algorithm实现。

如果您使用的是Sun JDK附带的JPEG编码器,那么您还必须确保您传送的图像没有Alpha通道。

例:

 private static final int[] RGB_MASKS = {0xFF0000, 0xFF00, 0xFF}; private static final ColorModel RGB_OPAQUE = new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]); // ... String sUrl="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; URL url = new URL(sUrl); Image img = Toolkit.getDefaultToolkit().createImage(url); PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, true); pg.grabPixels(); int width = pg.getWidth(), height = pg.getHeight(); DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight()); WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null); BufferedImage bi = new BufferedImage(RGB_OPAQUE, raster, false, null); String to = "D:/temp/result.jpg"; ImageIO.write(bi, "jpg", new File(to)); 

注:我的猜测是颜色configuration文件已损坏, Toolkit.createImage()忽略所有颜色configuration文件。 如果是这样,这将降低具有正确颜色configuration文件的JPEG的质量。

我有类似的问题。 但后来我用这个解决了它

  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //do something to populate the image //such as image.setRGB( x, y, pixelValue); //set your own pixels color ImageIO.write(image, "jpg", new File("D:\\test.jpg")); 

请注意,我正在使用Java版本1.6.0_25-b06,它只是正常工作。

也许你可以检查Java版本。

这适用于我:

 int w = originalImage.getWidth(); int h = originalImage.getHeight(); BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); int[] rgb = originalImage.getRGB(0, 0, w, h, null, 0, w); newImage.setRGB(0, 0, w, h, rgb, 0, w); 
 BufferedImage originalImage = ImageIO.read(getContent()); BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR); for (int x = 0; x < originalImage.getWidth(); x++) { for (int y = 0; y < originalImage.getHeight(); y++) { newImage.setRGB(x, y, originalImage.getRGB(x, y)); } } 

这为我做了诡计

使用ImageIO读写图像时遇到同样的问题。 在阅读这里的答案后,我将JRE从openjdk version "1.8.0_91"更改为HotSpot java version "1.8.0_102" 。 这个提示在finnw的回答中并不明显,但值得一试;-)

因此问题解决了! 所以,如果您使用OpenJDK JRE并免费更改您的JRE,请更改HotSpot并且不需要更改您的代码。

  • 对我来说,问题不在于阅读,而在于写作
  • ImageIO将愉快地从ARGB BufferedImages写入JPG文件
  • 浏览器/其他程序然后将此4通道文件解释为CMYK颜色或其他内容,从而产生此问题中所述的效果
  • 解决scheme :确保传递给ImageIO.write的BufferedImage属于RGBtypes(不是ARGB)
  • 这也解释了为什么问题只出现在保存为JPEG时,而不是保存到PNG
  • 我花了很长时间才弄清楚,因为我自己的图像工具总是会随时转换成ARGB,所以我总是将ARGB图像传递给ImageIO.write,却没有意识到它