-1

我正在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){}      

}

如果我png为图像选择格式,ImageIO.write则可以成功保存,但如果格式为,jpg则保存黑色图像,并且color space该黑色图像的CMYK. 即使它RGB与原始文件一起使用,我也在控制台上打印了它,然后再保存文件。

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

更新:正如迈克所问,我阅读并重jpg新生成了由ImageIo. 结果是一样的,一个黑色的图像。

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 时,我注意到了这一点。下面是 image( CMYK) CMYK 转换文件 的原始文件: 原始文件

我设法正确地工作。该线程 上的一位出色的个人建议了此解决方案,甚至效果很好。

但很少有问题保持不变:

  1. 为什么这只发生在blobjavascript 发送的数据上,而不是前面提到的普通文件选择器
  2. jpg为什么仅在将图像格式设置为而不是使用 时发出png?为什么改变color space_jpgImageIo
4

1 回答 1

0

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

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

由 ISO 22028-1 标准在词汇表中定义的 RGB 颜色空间规定它必须包括以下定义: 1. 原色 2. 传递函数 3. 白点

对于 CMYK,必须明确标识纸张类型、油墨成分和光源等变量的响应。

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

于 2020-01-17T19:23:12.537 回答