Java 使用ImageIO.write jpg文件时出现问题:粉红色背景
我正在使用以下代码编写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.
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。感谢您的解释,它与其他答案中提供的工作片段相辅相成。