Соблюдение ориентации EXIF ​​при отображении фотографий с iPhone в Интернете

Я разрабатываю приложение камеры для iPhone, которое загружает изображение в Amazon S3, и это изображение отображается на веб-сайте. Когда iPhone делает снимок, он всегда сохраняет фотографию в вертикальном положении, а ориентация, используемая для правильного просмотра фотографии, сохраняется в данных EXIF ​​изображения. Поэтому, если я сделаю снимок на iPhone и открою его в FireFox без обработки данных EXIF, изображение может быть перевернутым или перевернутым.

Моя проблема в том, что я не знаю, как отобразить фотографию в правильной ориентации на сайте. Мое текущее решение - повернуть фотографию в приложении для iPhone, но я бы не стал этого делать. Есть ли способ соблюдать данные EXIF ​​при отображении в Интернете без предварительной обработки изображения?


person GingerBreadMane    schedule 16.03.2010    source источник


Ответы (2)


У вас есть несколько вариантов, перечисленных в моем порядке предпочтений.

  1. Поверните изображение на камере.
  2. Загрузите данные через Amazon EC2 и используйте программу для чтения exif и выполнения ротации.
  3. Запустите на своем веб-сервере программу, которая проксирует s3 и выполняет ротацию.
  4. Используйте необычный Javascript и DHTML.

Вариант 3 может быть ненадежным для разных браузеров, и я не уверен в производительности. Вариант 2 добавит ненужной сложности. Возможно, вы не захотите этого делать, но если вы не планируете использовать сеть для чего-либо, кроме хранилища, вариант 1 лучше всего.

person mikerobi    schedule 17.03.2010

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

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

JPEG хранится как серия ячеек 8x8 - их можно по отдельности вращать и переставлять без потери качества (с шагом 90 градусов) - тогда вам необходимо обновить метаданные, содержащие информацию о размере.

Вот код C ++, который вы можете попробовать перенести

http://eng.neologica.it/download/downloadIJGWin32.html

Для .NET моя компания (Atalasoft) предоставляет SDK, который может это сделать.

Другой вариант - прочитать JPEG, повернуть и затем сохранить как PNG, но размер файла будет намного больше.

person Lou Franco    schedule 17.03.2010
comment
При высоких степенях сжатия ваши пользователи не смогут заметить разницу после 1 поворота с потерями. На уровнях качества, где есть очевидные артефакты сжатия, для неподготовленного глаза это могло быть проблемой. Имелось вращение с потерями. - person mikerobi; 17.03.2010
comment
@William Denniss, как серьезный фотограф я понимаю, откуда вы пришли, но как веб-разработчик меня больше интересует визуальное без потерь, чем цифровое без потерь. При высоких степенях сжатия может быть практически невозможно определить, было ли изображение повторно сжато. Проблемы возникают только при чрезмерном или многократном повторном сжатии. - person mikerobi; 15.09.2010