Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 读取JPEG:ImageIO.read()会弄乱颜色空间_Java_Jpeg_Javax.imageio - Fatal编程技术网

Java 读取JPEG:ImageIO.read()会弄乱颜色空间

Java 读取JPEG:ImageIO.read()会弄乱颜色空间,java,jpeg,javax.imageio,Java,Jpeg,Javax.imageio,我正在尝试在Servlet中读取、重新缩放和保存图像。这就是相关代码: BufferedImage image = ImageIO.read(file); BufferedImage after = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); AffineTransform at = AffineTransform.getScaleInstance(factor, factor); AffineTransformO

我正在尝试在Servlet中读取、重新缩放和保存图像。这就是相关代码:

BufferedImage image = ImageIO.read(file);

BufferedImage after = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
AffineTransform at = AffineTransform.getScaleInstance(factor, factor);
AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(image, null);

ImageIO.write(after, "JPG", file));
原始文件是一个普通的RGB Jpeg,但当我打开并保存该文件时,它显示为CMYK Jpeg。即使我没有重新缩放图像,也会发生这种情况,只是打开和关闭图像会导致问题

当我打开PNG或GIF时,一切都很好。有人知道在这里做什么吗?我希望ImageIO的读取方法能够保留原始的颜色空间

如果有另一种阅读jpeg的舒适方式


谢谢你的建议

在之后创建
,然后用
scaleOp.filter
覆盖它。这是正确的吗?所以你的
后图像可能不是RGB,即使你认为是?如果希望
after
成为RGB,则在进行转换之前,可能需要将
图像
绘制到
after
上。

我也遇到了同样的问题,并找到了此页面


我尝试了上面的建议,创建一个具有正确类型的BuffereImage,并在过滤器调用中将其用作after映像,而不是null;这确实解决了问题。

ImageIO.read
忽略了所有嵌入的元数据,包括一个嵌入的颜色配置文件,它定义了RBG值如何映射到物理设备,如屏幕或打印机

您可以单独读取元数据并将其传递给
ImageIO.write
,但只需将图像转换为(默认)sRGB颜色空间并忽略元数据就更容易了

如果您不介意丢失元数据,请替换

after = scaleOp.filter(image, null);

根据以下文件:


如果两个图像的颜色模型不匹配,则会进行颜色转换
在目标颜色模型中执行。

之后创建
,然后用
scaleOp.filter
覆盖它。这是正确的吗?所以你的
后图像可能不是RGB,即使你认为是?如果希望
after
成为RGB,则在进行转换之前,可能需要将
图像
绘制到
after
上。这是一个很好的提示:filter方法返回一个全新的BuffereImage。所以现在我知道了,图像在阅读时不会“着色”,而是在转换后。我尝试使用
图形将原始图像绘制到目标图像上。drawImage(image,scaleOp,0,0)
,现在它已正确转换。谢谢你的帮助!很高兴它起作用了!我将添加一个答案,以便qn可以关闭。我仍然想知道,为什么筛选方法不能正确工作,尽管。。。或者如果我可以使filter方法正确工作……是的,如果您执行了scapeOp.filter(image,after)
,它将使用您使用RGB类型创建的
after
图像。如果使用
null
,则该方法可以自由创建具有其选择的颜色空间的图像。
after = scaleOp.filter(image, after);