Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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:将CMYK图像读取到BufferdImage并保持正确的颜色模型_Java_Type Conversion_Javax.imageio_Color Scheme_Cmyk - Fatal编程技术网

Java:将CMYK图像读取到BufferdImage并保持正确的颜色模型

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

我使用twelvemonkeys集合(扩展imageio功能(非常有用,谢谢))构建了一个图像转换器(更改格式、比例等)
在这个转换器处理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();