我正在使用带有 Java 11 的 Java Image I/O 来读取 JPEG 图像,通过绘制缩放版本对其进行缩放,然后将其写入。(我使用这种技术是因为它产生了很好的结果,而且我尝试的 JAI 子样本平均技术在图像的某些侧面留下了黑色边框。)
重要的是,我丢弃了所有元数据。(我稍后将一小部分元数据单独写回最终图像,但这与本次讨论无关。)
…
imageReader.setInput(imageInputStream, true, true); //ignore metadata
oldImage = imageReader.read(0, imageReadParam);
…
Image scaledImage = oldImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
int oldImageType = oldImage.getType();
int newImageType = oldImageType != BufferedImage.TYPE_CUSTOM ? oldImageType //use the existing image type if it isn't custom
: (oldImage.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; //otherwise use RGB unless ARGB is needed for transparency
newImage = new BufferedImage(newWidth, newHeight, newImageType);
final Graphics2D graphics = newImage.createGraphics();
try {
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.drawImage(scaledImage, null, null);
} finally {
graphics.dispose();
}
scaledImage.flush();
…
imageWriter.setOutput(imageOutputStream);
IIOImage iioImage = new IIOImage(newImage, null, null); //write with no thumbnails and no metadata
imageWriter.write(null, iioImage, imageWriteParam);
…
一些输入图像具有 ICC 配置文件元数据部分。我担心丢弃 ICC 配置文件元数据是否会改变结果图像的显示方式。我从概念上了解图像颜色配置文件是什么,但我不知道它们如何在文件中工作以及它们如何与颜色空间交互。
我的问题总结:如果我在使用 Java Image I/O 处理图像时总是丢弃 ICC 配置文件和其他与配置文件相关的元数据部分,我如何确保生成的图像颜色正确?
通过与某人的讨论,我推断这些 ICC 配置文件可能适用于 sRGB 以外的颜色空间。(这是真的吗?)如果是这样,使用 Java Image I/O 将图像转换为 sRGB 是否会考虑 ICC 配置文件以便我可以丢弃它?如果是这样,我怎么知道我是否正在转换为 sRGB?
在上面的代码中,我尝试使用现有的图像类型(因为我认为最好不要更改任何内容),除非类型是“自定义”,在这种情况下,我选择一种简单的 RGB 类型。
int newImageType = oldImageType != BufferedImage.TYPE_CUSTOM ? oldImageType //use the existing image type if it isn't custom
: (oldImage.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; //otherwise use RGB unless ARGB is needed for transparency
但是,如果我尽可能使用旧的图像类型,那可能会使用 RGB 以外的颜色空间,需要 ICC 配置文件吗?如果我丢弃 ICC 配置文件,图像颜色会不正确吗?我应该以某种方式强制 Java Image I/O 转换为 RGB 吗?
我的部分疑问无疑是由于我不了解颜色配置文件在文件中的工作原理,因此,如果您知道一个好的概述,也将不胜感激(不会因字节而迷失在泥泞中)级别详细信息)。
提前感谢您分享您的专业知识。