ImageIO.write преобразование цветового пространства RGB в CMYK для изображения JPG - PullRequest
0 голосов
/ 17 января 2020

Я отправляю 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) CMYK converted file Оригинальный файл ниже: Original file

Мне удалось правильно его обработать. Великий личный человек в этой теме предложил это решение , и оно даже сработало.

Но несколько вопросов остались прежними:

  1. Почему это происходит только с blob данными, отправляемыми javascript, а не с обычным селектором файлов, как упоминалось ранее
  2. Почему проблема возникает только при установке формата изображения на jpg, а не с png? И почему изменение color space в jpg на ImageIo

1 Ответ

1 голос
/ 17 января 2020

RGB и CMYK - это не цветовые пространства, а модели цветового кодирования.

В обоих состояниях недостаточно информации для обеспечения значимого решения.

Цветовое пространство RGB, как определено в стандарте ISO 22028-1 в глоссарии предусмотрено, что оно должно включать определения: 1. основных цветов 2. передаточной функции (ей) 3. белой точки

Для CMYK ответы должны быть четко определены для переменные, такие как тип бумаги, состав чернил и источник света.

Игнорирование любой из этих граней означает, что результирующее преобразование цвета совершенно бессмысленно и никому не приносит пользы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...