Какое значение имеет порядок JPEG в кодировании? - PullRequest
9 голосов
/ 24 августа 2011

В настоящее время я работаю над большим проектом, который включает в себя картинки. Одна из больших проблем, с которыми я сталкиваюсь, связана с порядком картинки (jpeg, чтобы быть более ясным). Я всегда думал, что в нашем современном мире нам не нужно беспокоиться об этом предмете, но сейчас я не уверен.

Что я делаю:

  1. Я делаю HTTP-запрос к IP-камере, камера возвращает мне массив байтов.
  2. Я разбираю эти байты в объект Image в .NET, используя Image.FromStream.
  3. Я беру объект Image и сохраняю в физический файл на жестком диске.

Эти изображения затем используются в другом модуле из моего приложения, в котором используется сторонний "просмотрщик", который выполняет некоторые манипуляции с изображением. Зритель работает со всей картиной, созданной на компьютере в Windows XP и Windows Vista. Но когда изображение генерируется с помощью компьютера с Windows 7, все изображения портятся.

Допустим, изображение, созданное в Windows XP, будет называться PictureXP, а изображение, созданное в Windows 7, будет называться Picture7. Я проверил файлы с помощью exiftools и обнаружил, что между PictureXP и Picture7 было два поля, которые различались.

PictureXP: Exif Byte Order: Little-endian Picture7: Exif Byte Order: Big-endian Picture7 также имеет дополнительное поле: Комментарий пользователя:.

Эти два изображения могут быть открыты в обычном режиме в любом приложении для просмотра фотографий, только в этом средстве просмотра третьего лица изображение может быть перепутано, и единственное различие между этими 3 изображениями заключается в этих полях.

Что я хочу знать:

  1. Возможно ли, что третьему лицу нужно добавить дополнительный код в свое программное обеспечение, чтобы иметь дело с порядком байтов изображения? Я предполагаю, что все программы для работы с изображениями имеют дело с этим?
  2. Могу ли я изменить порядковый номер моего jpeg на постоянный? Я где-то читал, что содержимое файла jpeg всегда должно иметь одинаковый порядок байтов, но кажется, что оно не учитывает данные exif. Если это возможно, я бы хотел решение в .NET ...
  3. Все, что может помочь пройти через эту ситуацию, также будет рассматриваться как ответ.

Большое спасибо!

РЕДАКТИРОВАТЬ 1 : я нашел эту статью , подтверждающую, что endiannes, найденный в заголовке exif, применим только к заголовку exif и что файл jpeg всегда находится в big-endian. Так есть ли способ изменить заголовок exif, чтобы сторонний софт мог читать то, что ему нужно?

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Хорошо, поэтому я нашел свой ответ, задав вопрос Филу, автору exiftool

Вы можете посмотреть нить, которую я имел с ним здесь.

  1. Да, это возможно.Сторонний SDK не знал, что заголовок exif может быть закодирован с использованием порядка байтов с прямым порядком байтов или байтов с прямым порядком байтов, и читал только с использованием порядков с прямым порядком байтов.Изменение всей моей картинки на little-endian решило проблему.
  2. Ответ из 2 частей: Во-первых, данные в формате jpeg всегда с прямым порядком байтов, как сказано в моем редактировании.Во-вторых, заголовок exif может быть как с прямым порядком байтов, так и с прямым порядком байтов, и его можно изменить с помощью exiftool.

В командной строке:

exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg

На этой странице .

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

1 голос
/ 24 августа 2011

Я думаю, что, возможно, проблема в поле комментария пользователя.Я прочитал где-то , что Windows Vista (и, вероятно, Windows 7) сохраняет поле комментария пользователя как Unicode в порядке байтов с прямым порядком байтов, независимо от порядка байтов информации EXIF.Поскольку единственное различие между PictureXP и Picture7 - это порядковый номер информации exif и поля комментария пользователя, возможно, вы должны выглядеть так

Удачи

...