Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ImageIO.write jpg文件时出现问题:粉红色背景_Java_Image Processing - Fatal编程技术网

Java 使用ImageIO.write jpg文件时出现问题:粉红色背景

Java 使用ImageIO.write jpg文件时出现问题:粉红色背景,java,image-processing,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)); 但是我得到了结果。jpg是一个粉红色的背景图像: 您可以使用Toolkit.

我正在使用以下代码编写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));
但是我得到了
结果。jpg
是一个粉红色的背景图像:


您可以使用
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的质量。

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

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

buffereImage originalImage=ImageIO.read(getContent());
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));
        }
    }
BuffereImage newImage=新的BuffereImage(originalImage.getWidth(),originalImage.getHeight(),BuffereImage.TYPE_3BYTE_BGR); 对于(int x=0;x
这对我来说很有用

这对我来说很有用:

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

在使用
ImageIO
读写图像时,我遇到了同样的问题。在阅读了这里的答案之后,我将我的JRE-从
openjdk版本“1.8.0\u 91”
更改为
HotSpot java版本“1.8.0\u 102”
finnw
的答案中的暗示并不明显,但值得一试;-)

问题就这样解决了!因此,如果您正在使用OpenJDK JRE,并且可以自由地更改JRE,更改它,您就不需要更改代码。

  • 对我来说,问题不在于阅读,而在于写作
  • ImageIO将很高兴地从ARGB buffereImage写入JPG文件
  • 浏览器/其他程序然后将此4通道文件解释为CMYK颜色或其他内容,从而产生本问题中描述的效果
  • 解决方案对我来说:确保传递给ImageIO.write的BuffereImage的类型为RGB(不是ARGB)
  • 这也解释了为什么问题仅在保存为jpeg时出现,而在保存为png时不出现
  • 我花了很长时间才弄明白,因为我自己的图像工具总是动态地转换为ARGB,所以我总是将ARGB图像传递给ImageIO.write,而没有意识到这一点

ImageIO.write()
不是重复的,而是相似的结果:谢谢,但是
找不到页面
,我无法得到答案您使用ImageIO包装器阅读jpeg时使用的底层读卡器是什么?这可能有问题。我想这与透明度属性有关。我在尝试旋转图像时也遇到了同样的问题。设置了一个透明属性,一旦我删除了它,一切都很好。可能是完全重复的工作!在这里输入_INT_RGB是至关重要的-这会删除粉色色调-只需将源ARGB图像中的像素克隆到输出RGB图像中,粉色色调就消失了!与此非常相似的答案(尽管此代码示例更容易理解)谢谢,它确实有效。尝试了此方法,但对于这个更完整的代码片段,它不适用于meThanks。感谢您的解释,它与其他答案中提供的工作片段相辅相成。