Альтернатива Java Imageio Pure Java для обнаружения изображений CMYK

StackOverflow https://stackoverflow.com/questions/6829428

  •  26-10-2019
  •  | 
  •  

Вопрос

Сначала я хотел бы объяснить ситуацию/требования, которые приводят к вопросу:

В нашем веб -приложении мы не можем поддерживать изображения CMYK (JPEG), так как IE 8 и ниже не могут их отображать. Таким образом, нам нужно обнаружить, когда кто -то хочет загрузить такое изображение и отрицать его.

К сожалению, Imageio's Java не будет читать эти изображения и не позволит мне получить обнаруженное цветовое пространство. От отладки кажется JPEGImageReader Внутренне получает цветовой космический код 11 (что будет означать JCS_YCCK) но я не могу безопасно получить доступ к этой информации.

При запросе читателя для типов изображений я ничего не получаю для CMYK, поэтому я могу предположить no image types = unsupported image.

Я преобразовал изображение источника CMYK в RGB, используя инструмент визуализации, чтобы проверить, будет ли оно тогда читаемо (я попытался имитировать шаги администратора при получении сообщения «No CMYK поддержан»). Однако, JPEGImageReader не прочитал бы это изображение, так как оно предполагает (Комментарий в источнике!) Трехкомпонентное цветовое пространство RGB, но заголовок изображения сообщает 4 компонента (возможно, RGBA или ARGB) и, следовательно, IllegalArgumentException брошен.

Таким образом, Imageio не является вариантом, так как я не могу надежно получить цветовое пространство изображения и не могу сказать администратору, почему в остальном прекрасное изображение (оно может отображаться в браузере) не будет принято из -за некоторого внутреннего ошибка.

Это заставило меня попробовать Jai Imageio CLibJPEGImageReader отлично справляется и правильно считывает все мои тестовые изображения.

Однако, поскольку мы развертываем наше приложение в JBoss, в котором также могут принять другие приложения, мы хотели бы сохранить их как можно более изолированными. Afaik, мне нужно было установить Jai Imageio в JRE или иным образом сделать местные LIBS доступными для их использования, и, следовательно много проверить, чтобы убедиться, что это не так).

Это объяснение вопроса, и здесь он снова приходит:Есть ли какая -то чистая альтернатива Java Imageio, которая надежно обнаруживает и, возможно, преобразует изображения CMYK?

Заранее спасибо,

Томас

Это было полезно?

Решение

Я нашел решение, которое в порядке для наших нужд: Apache Commons Sanselan. Анкет Эта библиотека читает заголовки JPEG довольно быстрые и точные (по крайней мере, все мои тестовые изображения), а также ряд других форматов изображений.

Недостатком является то, что он не будет читать данные изображения JPEG, но я могу сделать это с помощью основных инструментов JRE.

Чтение изображений JPEG для преобразования довольно просто (те, которые ImageIO тоже отказывается читать):

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream( new File(pFilename) ) );
BufferedImage sourceImg = decoder.decodeAsBufferedImage();

Тогда, если Санселан скажет мне, что изображение на самом деле CMYK, я получаю исходное изображение и конвертируется:

for( /*each pixel in the raster, which is represented as int[4]*/ )
{  
   double k = pixel[3] / 255.0;

   double r = (255.0 - pixel[0])*k;
   double g = (255.0 - pixel[1])*k;
   double b = (255.0 - pixel[2])*k;
}

Это дает довольно хорошие результаты в том, что изображения RGB не слишком ярко или темные. Тем не менее, я не уверен, почему умножение с k предотвращает осветление. JPEG на самом деле декодируется нативным кодом, а преобразование CMYK-> RGB Я получил что-то другое, я только что попробовал умножение, чтобы увидеть визуальный результат.

Если бы кто -то мог пролить свет на это, я был бы благодарен.

Другие советы

Я опубликовал чистую Яву решение Для чтения всевозможных изображений JPEG и преобразования их в RGB.

Он построен на следующих фактах:

  • В то время как Imageio не может читать изображения JPEG с CMYK в качестве буферного изображения, он может считывать данные необработанного пикселя (растровый).
  • Sanselan (или Apache Commons Imaging, как его называют сейчас) можно использовать для чтения деталей изображений CMYK.
  • Есть изображения с перевернутыми значениями CMYK (старая ошибка Photoshop).
  • Есть изображения с YCCK вместо CMYK (можно легко преобразовать).

В нашем веб -приложении мы не можем поддерживать изображения CMYK (JPEG), так как IE 8 и ниже не могут их отображать. Таким образом, нам нужно обнаружить, когда кто -то хочет загрузить такое изображение и отрицать его.

Я не согласен с твоим «Таким образом, нам нужно обнаружить, когда кто -то хочет загрузить такое изображение и отрицать его». Анкет Гораздо более удобной политикой будет преобразование ее в что-то другое, кроме CMYK.

Остальная часть вашего поста немного сбивает с толку в том, что вы видели, что вы просите об обнаружении и конверсии, которые являются двумя разными вещами. Еще раз, я думаю, что преобразование изображения гораздо более удобно.

Не нужно писать жирным шрифтом, кстати:

Есть ли какая -то чистая альтернатива Java Imageio, которая надежно обнаруживает и, возможно, преобразует изображения CMYK?

Pure Java Я не знаю, но ImageMagick отлично работает, чтобы преобразовать изображение CMYK в RGB. Вызов Imagemagick На стороне сервера от Java действительно не сложно. Я делал это вручную, вызывая внешний процесс, но в настоящее время есть обертки, как Jmagick а также im4java.

Остерегайтесь друга Импорт com.sun.image.codec.jpeg.*.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top