Я отправляю jpg
изображение с клиента. изображение отправляется в виде blob . Вот код в javascript, который отправляет canvas image
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
создается из этого, а 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. Вот изображение (CMYK
) Оригинальный файл ниже:
Мне удалось правильно его обработать. Великий личный человек в этой теме предложил это решение , и оно даже сработало.
Но несколько вопросов остались прежними:
- Почему это происходит только с
blob
данными, отправляемыми javascript, а не с обычным селектором файлов, как упоминалось ранее - Почему проблема возникает только при установке формата изображения на
jpg
, а не с png
? И почему изменение color space
в jpg
на ImageIo