我正在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
)
的原始文件:
我设法正确地工作。该线程 上的一位出色的个人建议了此解决方案,甚至效果很好。
但很少有问题保持不变:
- 为什么这只发生在
blob
javascript 发送的数据上,而不是前面提到的普通文件选择器 jpg
为什么仅在将图像格式设置为而不是使用 时发出png
?为什么改变color space
_jpg
ImageIo