Ориентация изображения 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, что я считаю хорошим.
Это фотография фотографии, которую я сделал своим телефоном (обратите внимание на правильную ориентацию), она выглядит точно так же, как и на моем телефоне, когда я делал снимок:
Вот как выглядит изображение в Gmail после того, как я отправил его себе по электронной почте (похоже, Gmail обрабатывает его правильно):
Вот как изображение выглядит как миниатюра в окнах (не похоже, что оно обрабатывается должным образом):
А вот как выглядит настоящее изображение при открытии с помощью Windows Photo Viewer (все еще не обрабатывается должным образом):
После всех комментариев по этому вопросу, вот о чем я думаю ... iPhone берет изображение и говорит, что для правильного отображения его нужно повернуть на 90 градусов. Эта информация будет в данных EXIF. (Почему его нужно повернуть на 90 градусов, а не по умолчанию на прямую вертикаль, я не знаю). Отсюда, Gmail достаточно умен, чтобы читать и анализировать эти данные EXIF и правильно отображать их. Однако Windows недостаточно умна для чтения данных EXIF и поэтому отображает изображениеimproperly, Верны ли мои предположения?