Ориентация изображения iOS имеет странное поведение

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

Мой вопрос на этот разwhy is this happening? Почему Apple вращает изображения? Когда я делаю фотографию правой стороной вверх, если я не выполняю код, упомянутый выше, при сохранении фотографии она сохраняется повернутой. Теперь мой обходной путь был в порядке вплоть до нескольких дней назад.

Мое приложение изменяет отдельные пиксели изображения, в частности альфа-канал PNG (поэтому любое преобразование JPEG выбрасывается из окна для моего сценария). Несколько дней назад я заметил, что несмотря на то, что изображение правильно отображается в моем приложении благодаря моему временному коду, когда мой алгоритм изменяет отдельные пиксели изображения, он думает, что изображение поворачивается. Таким образом, вместо изменения пикселей в верхней части изображения, он изменяет пиксели сбоку изображения (потому что считает, что его нужно повернуть)! Я не могу понять, как вращать изображение в памяти - в идеале я бы предпочел просто стереть этоimageOrientation пометить все вместе.

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

Этот код выглядит так:

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, что я считаю хорошим.

Это фотография фотографии, которую я сделал своим телефоном (обратите внимание на правильную ориентацию), она выглядит точно так же, как и на моем телефоне, когда я делал снимок:

Actual Photo taken on iPhone

Вот как выглядит изображение в Gmail после того, как я отправил его себе по электронной почте (похоже, Gmail обрабатывает его правильно):

Photo as it appears in Gmail

Вот как изображение выглядит как миниатюра в окнах (не похоже, что оно обрабатывается должным образом):

Windows Thumbnail

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

Windows Photo Viewer Version

После всех комментариев по этому вопросу, вот о чем я думаю ... iPhone берет изображение и говорит, что для правильного отображения его нужно повернуть на 90 градусов. Эта информация будет в данных EXIF. (Почему его нужно повернуть на 90 градусов, а не по умолчанию на прямую вертикаль, я не знаю). Отсюда, Gmail достаточно умен, чтобы читать и анализировать эти данные EXIF и правильно отображать их. Однако Windows недостаточно умна для чтения данных EXIF и поэтому отображает изображениеimproperly, Верны ли мои предположения?

Ответы на вопрос(12)

Ваш ответ на вопрос