Java 读取JPEG:ImageIO.read()会弄乱颜色空间
我正在尝试在Servlet中读取、重新缩放和保存图像。这就是相关代码: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
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);