繁体   English   中英

ImageIO.write 将 JPG 图像的色彩空间 RGB 转换为 CMYK

[英]ImageIO.write converting color space RGB to CMYK for a JPG image

我正在从客户端发送jpg图像。 图像以blob 的形式发送。 这是发送画布图像的javascript代码

canvas.toBlob((blob) => {
    this.setState({preview: blob},
        () => {
            console.log(blob.size);
            let data = new FormData();
            // const test = URL.createObjectURL(blob);
            // console.log(test);
            const file = new File([blob], "File name", {type: "image/png"});
            data.append("file", file);
            console.log(this.state.preview);
            axios({
                method: "POST",
                data: data,
                url: "/media",
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            }).then().catch()
            // axios.post("http://localhost:8085/api/media", data).then(r => {}).catch()
        }
    );
}, "image/jpg", 0)

所选文件是一个jpg文件,由于某些原因将其转换为canvas ,然后将其作为blob发送到服务器。

这是用java编写的服务器图像处理代码:

public void uploadMedia(MultipartFile mediaFile) {

  try{
    BufferedImage image = ImageIO.read(mediaFile.getInputStream());

    System.out.println(image.getColorModel().getColorSpace().getType() == ColorSpace.TYPE_RGB); //TRUE

    ImageIO.write(image, "jpg", new File("/Users/puspender/Desktop/Test/image.jpg"));  //BLACK IMAGE with CMYK color space
    ImageIO.write(image, "png", new File("/Users/puspender/Desktop/Test/image.png"));

  }catch(Exception e){}      

}

如果我为ImageIO.write选择png格式,则图像保存成功,但如果格式为jpg则保存黑色图像,并且该黑色图像的color space更改为CMYK 即使它是原始文件的RGB ,我也在保存文件之前在控制台上打印了它。

仅当在客户端上裁剪图像(或其他内容)然后从中创建canvas并将该canvas blob作为有效负载发送时,才会出现此问题。 使用<input type="file />选择文件时不会出现问题

更新:按照 Mike 的要求,我阅读ImageIoImageIo生成的黑色jpg 结果是一样的,一个黑色的图像。

File file = new File("/location/generated_black.jpg");
BufferedImage image = ImageIO.read(file);
ImageIO.write(image, "jpg", new File("/location/from-java-main-400x400.jpg"));

我还用原始文件测试了上面的代码,那时ImageIo正确处理了它。

我注意到一件重要的事情:黑色图像实际上不是黑色,它只是由于色彩空间的变化而受到干扰的颜色。 当我将其上传到 AWS S3 时,我注意到了这一点。 这是图像( CMYK CMYK 转换文件 原文件如下: 原始文件

我设法正确地工作。 这个线程上的一个伟大的个人建议了这个解决方案,它甚至运行良好。

但很少有问题保持不变:

  1. 为什么这只会发生在 javascript 发送的blob数据上,而不发生在前面提到的普通文件选择器上
  2. 为什么仅在将图像格式设置为jpg而不是png时才发出问题? 以及为什么ImageIojpg改变color space

RGB 和 CMYK 不是颜色空间,而是颜色编码模型。

任何一个州都没有足够的信息来提供有意义的解决方案。

术语表中的 ISO 22028-1 标准定义的 RGB 色彩空间规定,它必须包括以下定义: 1. 原色 2. 传递函数 3. 白点

对于 CMYK,必须清楚地识别纸张类型、油墨成分和光源等变量的响应。

忽略这些方面中的任何一个都意味着由此产生的颜色转换完全没有意义,而且对任何人都没有任何好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM