java-使用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));
但我得到的result.jpg是粉红色的背景图片:
Koerr asked 2020-06-20T07:12:44Z
6个解决方案
38 votes
您可以通过使用Toolkit.createImage()而不是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的质量。
finnw answered 2020-06-20T07:13:12Z
19 votes
我有类似的问题。 但是后来我用这个解决了
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版本。
Wen answered 2020-06-20T07:13:41Z
12 votes
这对我有用:
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);
Claudio Rossetto answered 2020-06-20T07:14:02Z
1 votes
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));
}
}
这对我有用
hans moleman answered 2020-06-20T07:14:22Z
1 votes
在使用ImageIO读写图像时,我遇到了相同的问题。在阅读答案后,我将JRE从openjdk version "1.8.0_91"更改为HotSpot java version "1.8.0_102"。在finnw的答案中提示并不明显,但值得尝试;-)
这样问题就解决了! 因此,如果您使用的是OpenJDK JRE,并且可以自由更改JRE,则可以将其更改为HotSpot,而无需更改代码。
Bazi answered 2020-06-20T07:14:46Z
1 votes
对我来说,问题不在于阅读,而在于写作
ImageIO将愉快地从ARGB BufferedImages写入JPG文件
浏览器/其他程序然后将此4通道文件解释为CMYK颜色或某种颜色,从而导致此问题中所述的效果
我的解决方案:确保传递给ImageIO.write的BufferedImage是RGB类型(而不是ARGB)
这也解释了为什么仅在保存为jpeg时才出现问题,而在保存为png时才出现问题
我花了很长时间才弄清楚,因为我自己的图像工具总是实时转换为ARGB,所以我总是将ARGB图像传递给ImageIO.write,而没有意识到
Reto Höhener answered 2020-06-20T07:15:29Z