Протягом останніх кількох тижнів я працював із зображеннями в об’єкті-c і помічав багато дивної поведінки. По-перше, як і у багатьох інших людей, у мене була така проблема, коли зображення, зроблені за допомогою камери (або зроблені за допомогою чужої камери та MMS-даних для мене), повертаються на 90 градусів. Я не був впевнений, чому у світі це відбувається (звідси моє запитання ), але я зміг придумати дешеву роботу.
Цього разу моє запитання - чому це відбувається ? Чому Apple обертає зображення? Коли я роблю фотографію камерою правою стороною вгору, якщо я не виконую свій код, згаданий вище, коли я зберігаю фотографію, вона зберігається обертається. Тепер мій спосіб обійтись був нормальним до кількох днів тому.
Моя програма модифікує окремі пікселі зображення, зокрема альфа-канал PNG (тому будь-яке перетворення JPEG викидається з вікна для мого сценарію). Кілька днів тому я помітив, що, незважаючи на те, що зображення відображається належним чином у моїй програмі завдяки коду обхідного рішення, коли мій алгоритм модифікує окремі пікселі зображення, він вважає, що зображення обертається. Отже, замість того, щоб змінювати пікселі у верхній частині зображення, він змінює пікселі збоку зображення (бо вважає, що його слід повертати)! Я не можу зрозуміти, як повернути зображення в пам'яті - в ідеалі я волів би просто стерти цей imageOrientationпрапор разом.
Ось щось інше, що мене також бентежило ... Коли я роблю фото, для imageOrientationнього встановлюється значення 3. Мій код обхідного шляху досить розумний, щоб це зрозуміти і перевернути, щоб користувач ніколи не помічав. Крім того, мій код для збереження зображення в бібліотеці це розуміє, перевертає, а потім зберігає, щоб він правильно відображався в рулоні камери.
Цей код виглядає так:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Коли я завантажую це нещодавно збережене зображення у свій додаток, imageOrientationце 0 - саме те, що я хочу бачити, і мій обхідний спосіб обертання навіть не потрібно запускати (примітка: при завантаженні зображень з Інтернету на відміну від зображень, зроблених камерою , imageOrientationзавжди дорівнює 0, що призводить до ідеальної поведінки). З якоїсь причини мій код збереження, здається, знищує цей imageOrientationпрапор. Я сподівався просто вкрасти цей код і використати його, щоб стерти мою imageOrientation, як тільки користувач зробить фотографію та додасть її до програми, але це, здається, не працює. Ви UIImageWriteToSavedPhotosAlbumробите щось особливе imageOrientation?
Найкращим рішенням цієї проблеми було б просто здути, imageOrientationяк тільки користувач закінчить фотографувати. Я припускаю, що у Apple поведінка обертання зроблена з причини, правда? Декілька людей припустили, що це дефект Apple.
(... якщо ви ще не загубилися ... Примітка2: Коли я роблю горизонтальну фотографію, здається, все працює ідеально, як фотографії, зроблені з Інтернету)
РЕДАГУВАТИ:
Ось як насправді виглядають деякі зображення та сценарії. Виходячи з дотепер зроблених коментарів, схоже, ця дивна поведінка - це більше, ніж просто поведінка iPhone, що, на мою думку, добре.
Це фотографія фотографії, яку я зробив із телефоном (зверніть увагу на правильну орієнтацію), вона виглядає точно так, як це було на моєму телефоні, коли я зробив фотографію:

Ось як виглядає зображення в Gmail після того, як я надіслав його собі по електронній пошті (схоже, Gmail обробляє його належним чином):

Ось як зображення виглядає як мініатюра у вікнах (не схоже на те, що з ним обробляються належним чином):

А ось як виглядає фактичне зображення при відкритті за допомогою Windows Photo Viewer (все ще не обробляється належним чином):

Після всіх коментарів щодо цього питання, ось що я думаю ... iPhone робить знімок і каже: "щоб правильно відобразити це, його потрібно повернути на 90 градусів". Ця інформація міститься в даних EXIF. (Чому його потрібно повертати на 90 градусів, а не за замовчуванням прямим вертикальним, я не знаю). Звідси Gmail досить розумний, щоб читати та аналізувати дані EXIF та правильно відображати їх. Однак Windows недостатньо розумна для читання даних EXIF, і тому зображення відображається неправильно . Чи правильні мої припущення?