使用ImageIO.write jpg文件的问题:粉红色的背景

时间:2010-12-08 10:28:41

标签: java image-processing

我正在使用以下代码编写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));

但我得到result.jpg是粉红色的背景图片:

alt text

6 个答案:

答案 0 :(得分:38)

您可以使用Toolkit.createImage(url)代替使用不同解码算法实现的ImageIO.read(url)来解决此问题。

如果您使用的是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));

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

答案 1 :(得分:19)

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

   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版本。

答案 2 :(得分:12)

这对我有用:

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

答案 3 :(得分:1)

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

这对我有把戏

答案 4 :(得分:1)

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

因此问题解决了!因此,如果您正在使用OpenJDK JRE并可以自由更改您的JRE,请将其更改为HotSpot,您无需更改代码。

答案 5 :(得分:1)

  • 对我来说,问题不是阅读而是写作
  • ImageIO很乐意从ARGB BufferedImages
  • 编写JPG文件
  • 浏览器/其他程序会将此4通道文件解释为CMYK颜色或其他内容,从而产生此问题中描述的效果
  • 解决方案对我来说:确保传递给ImageIO.write的BufferedImage是RGB类型(不是ARGB)
  • 这也解释了为什么问题仅在保存到jpeg时出现,而在保存到png时不出现
  • 这花了很长时间让我弄清楚,因为我自己的图像工具总是在运行中转换为ARGB,所以我总是将ARGB图像传递给ImageIO.write,却没有意识到它