Java:将CMYK图像读取到BufferdImage并保持正确的颜色模型
我使用twelvemonkeys集合(扩展imageio功能(非常有用,谢谢))构建了一个图像转换器(更改格式、比例等)Java:将CMYK图像读取到BufferdImage并保持正确的颜色模型,java,type-conversion,javax.imageio,color-scheme,cmyk,Java,Type Conversion,Javax.imageio,Color Scheme,Cmyk,我使用twelvemonkeys集合(扩展imageio功能(非常有用,谢谢))构建了一个图像转换器(更改格式、比例等) 在这个转换器处理RGB图像之前,一切正常。但现在我也必须转换CMYK图像。 读取CMYK图像(自动转换为RGB)并将其写入磁盘是没有问题的。问题是图像必须保持CMYK格式 我尝试了以下选项来解决我的问题: a) 使用高级读取过程为输入文件设置CMYK颜色模型: ImageInputStream input = ImageIO.createImageInputStream(fi
在这个转换器处理RGB图像之前,一切正常。但现在我也必须转换CMYK图像。 读取CMYK图像(自动转换为RGB)并将其写入磁盘是没有问题的。问题是图像必须保持CMYK格式 我尝试了以下选项来解决我的问题: a) 使用高级读取过程为输入文件设置CMYK颜色模型:
ImageInputStream input = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(input); // = com.twelvemonkeys.imageio.plugins.jpeg
ImageReader reader = readers.next();
reader.setInput(input);
ImageReadParam param = reader.getDefaultReadParam();
for (Iterator<ImageTypeSpecifier> iterator = reader.getImageTypes(0); iterator.hasNext();) {
ImageTypeSpecifier currStep = iterator.next();
//Quick and drity test: Search a CMYK image type for the reading process
if (currStep.getBufferedImageType() == 0) {
param.setDestinationType(currStep);
break;
}
}
BufferedImage image = reader.read(0, param);
ImageIO.write(image, "jpg", output);
reader.dispose();
并尝试将其保存为CMYK图像:
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageOutputStream output = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(output);
//Set DestinationType to CMYK image type
ImageWriteParam param = writer.getDefaultWriteParam();
param.setDestinationType(CMYK_IMAGE_TYPE); // Same ImageTypeSpecifier as in the first example used for reading (just for testing)
writer.write(img);
output.close();
writer.dispose();
迭代器编写器=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=writers.next();
ImageOutputStream输出=ImageIO.createImageOutputStream(outputFile);
writer.setOutput(输出);
//将DestinationType设置为CMYK图像类型
ImageWriteParam参数=writer.getDefaultWriteParam();
参数setDestinationType(CMYK_图像_类型);//与第一个示例中用于读取的ImageTypeSpecifier相同(仅用于测试)
writer.write(img);
output.close();
writer.dispose();
结果:CMYK图像颜色错误(有点橙色)
主要问题:是否有方法读取CMYK图像并保留原始颜色模型(无RGB转换),以及是否有方法使用高级写入过程(最好是使用集合)将RGB(读取CMYK+自动转换=默认RGB)图像保存为CMYK图像?Hi Joern!你在正确的轨道上!不幸的是,这不是直截了当的。。。我正在开发一种改进的
JPEGImageWriter
,如果给定一幅CMYK颜色模型的图像,它会做正确的事情。然而,我将实际的JPEG编码委托给的标准编写器并不那么合作。我将尝试提出一个解决方案,同时,您需要研究使用write
方法来获取元数据和ioimage
+以某种方式将ICC配置文件添加到元数据中,最好与Adobe APP14-segment一起使用。另外,请参阅,我认为了解上述任务将非常有用。嘿,Harald,非常感谢您的快速回复。现在我创建了一个元数据对象:iimetadata metadata=writer.getDefaultImageMetadata(imageType,param)
并将写入函数更改为writer.write(null,新IIOImage(cmykInput,null,元数据),param)代码>探索元数据对象显示,它包含一个带有AdobeMarkerSegment元素的arrayList(标记序列)。这就是你说的那部分吗?是的,那是APP14部分。您还需要APP2“ICC\U配置文件”部分来包含您的ICC配置文件。为了便于阅读,您可以使用IIOImage img=reader.readAll(index,param)
。我尝试了第一个选项,它仍然会转换为sRGB。我尝试使用reader.getRawImageType(0),它会进行一些转换,从而产生灰度交错。如何使用PDFBox从磁盘读取CMYK JPEG并将其写入DeviceCMYK颜色空间中的PDF?十二猴子计划暗示这是可以做到的,但我不知所措。
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageOutputStream output = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(output);
//Set DestinationType to CMYK image type
ImageWriteParam param = writer.getDefaultWriteParam();
param.setDestinationType(CMYK_IMAGE_TYPE); // Same ImageTypeSpecifier as in the first example used for reading (just for testing)
writer.write(img);
output.close();
writer.dispose();