Какое значение имеет порядковый номер JPEG при кодировании?
В настоящее время я работаю над большим проектом, который включает в себя фотографии. Одна из самых больших проблем, с которыми я сталкиваюсь, связана с порядком картинки (jpeg, чтобы быть более ясным). Я всегда думал, что в нашем современном мире нам не нужно беспокоиться об этом предмете, но сейчас я не уверен.
Что я делаю:
- Я делаю HTTP-запрос к IP-камере, камера возвращает мне массив байтов.
- Я анализирую эти байты в объект Image в.NET, используя Image.FromStream.
- Я беру свой объект Image и делаю Сохранить в физический файл на жестком диске.
Эти изображения затем используются в другом модуле из моего приложения, в котором используется сторонний "просмотрщик", который выполняет некоторые манипуляции с изображением. Зритель работает со всей картиной, созданной на компьютере в Windows XP и Windows Vista. Но когда изображение генерируется с помощью компьютера с Windows 7, все изображения портятся.
Предположим, что изображение, созданное в Windows XP, будет называться PictureXP, а изображение, созданное в Windows 7, будет называться Picture7. Я проверил файлы с помощью exiftools и обнаружил, что в PictureXP и Picture7 было два поля, которые различались.
PictureXP: Порядок байтов Exif: младший порядок Picture7: Порядок байтов Exif: байтовый порядок Picture7 также имеет дополнительное поле: Комментарий пользователя: .
Эти два изображения могут быть открыты в обычном режиме в любом приложении для просмотра фотографий, только в этом средстве просмотра третьего лица изображение отображается полностью смешанным, и единственное различие между этими 3 изображениями заключается в этих полях.
Что я хочу знать:
- Возможно ли, что третьему лицу нужно добавить дополнительный код в свое программное обеспечение, чтобы иметь дело с порядком байтов? Я предполагаю, что все программы для работы с изображениями имеют дело с этим?
- Могу ли я изменить порядок байтов в моем jpeg, чтобы он всегда был в порядке байтов? Я где-то читал, что содержимое файла JPEG всегда должно иметь одинаковый порядок байтов, но кажется, что оно не учитывает данные exif. Если это возможно, я бы хотел решение в.NET...
- Все, что может помочь пройти через эту ситуацию, также будет рассматриваться как ответ.
Большое спасибо!
РЕДАКТИРОВАТЬ 1: Я нашел эту статью, подтверждающую, что endiannes, найденные в заголовке exif, применимы только к заголовку exif и что файл jpeg всегда находится в значении big-endian. Так есть ли способ изменить заголовок exif, чтобы сторонний софт мог читать то, что ему нужно?
2 ответа
Итак, я нашел ответ, задав вопрос Филу, автору exiftool
Вы можете увидеть нить, которую я имел с ним здесь.
- Да, это возможно. Сторонний SDK не знал, что заголовок exif может быть закодирован с использованием little-endian или big-endian, и только читал с использованием little-endian. Изменение всей моей картины на little-endian решило проблему.
- Ответ из 2 частей: Во-первых, данные в формате jpeg всегда имеют порядок байтов, как сказано в моем редактировании. Во-вторых, заголовок exif может быть как с прямым порядком байтов, так и с прямым порядком байтов, и его можно изменить с помощью exiftool.
В командной строке:
exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg
Вы также можете найти обертку для инструмента почти на любом языке на этой странице.
Большое спасибо за ваш интерес к вопросу и ответ, который я получил.
Я думаю, что, возможно, проблема с полем для комментариев пользователя. Я где- то читал, что Windows Vista (и, вероятно, Windows 7) сохраняет поле комментария пользователя как Unicode в порядке байтов с прямым порядком байтов, независимо от порядка байтов информации EXIF. Поскольку единственное различие между PictureXP и Picture7 - это порядковый номер информации exif и поля комментария пользователя, возможно, вы должны выглядеть так
Удачи