Java JPEG Converter для нечетных типов изображений - PullRequest
3 голосов
/ 06 октября 2011

У меня есть программа, которая изменяет размеры изображений, используя библиотеку изображений Мортеннобеля для фильтра / алгоритма масштабирования. Я использую стандартную библиотеку Java ImageIO для чтения файла в BufferedImage объект. Однако у меня проблема в том, что библиотека ImageIO принимает только стандартные формы изображений, и поэтому, если функция ImageIO.read() выдает IOException, я хочу поймать ее и преобразовать изображение в стандартную форму, такую ​​как JPEG.

Просто чтобы уточнить, у меня проблема в том, что некоторые изображения не имеют стандартного формата JPEG, т.е. FF D8 FF E0 JFIF, вместо этого они были созданы цифровой камерой или отредактированы в фотошопе, и формат FF D8 FF E1 Exif. Можно изменить этот формат, загрузив изображение в программу, подобную рисованию, и снова сохранив ее в формате JPEG, однако это не идеально для моей ситуации, поскольку я хотел бы, чтобы оно было автоматизировано.

Конвертировать из: FF D8 FF E1 Exif в FF D8 FF E0 JFIF

1 Ответ

3 голосов
/ 11 октября 2011

Первое поле после маркера FFE0 - это поле длины.Это 16 бит длиной с прямым порядком байтов и включает в себя длину поля длины, но не маркер FFE0.Просто скопируйте маркер FFE0 и связанные данные из существующего jpeg и поместите его между FFD8 и FFE1.

В соответствии со стандартом JFIF, заголовок JFIF должен следовать сразу после SOI (FFD8).Каждый jpeg без заголовка JFIF по сути сломан, так как нет способа узнать, какая цветовая кодировка используется.Конечно, есть Adobe JPEG, но они на самом деле не в счет.Если есть заголовок JFIF, вы знаете, что изображение закодировано в YCbCr.Если заголовка JFIF нет, вы можете предположить, что это YCbCr, но точно не знаете.

Подробнее о стандарте JFIF можно прочитать здесь: http://www.w3.org/Graphics/JPEG/jfif3.pdf

...