Спазване на ориентацията на 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