В течение последних нескольких недель я работал с изображениями в объективе-c и замечал много странного поведения. Во-первых, как и многие другие люди, у меня возникла такая проблема, когда изображения, снятые камерой (или снятые с камерой другого человека и MMS), повернуты на 90 градусов. Я не был уверен, почему в мире это происходило (следовательно, my question), но я смог придумать дешевую работу.iOS Ориентация изображения имеет странное поведение
Мой вопрос на этот раз Почему это происходит? Почему 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
. Я надеялся просто украсть этот код и использовать его, чтобы уничтожить мой образОриентации, как только пользователь сделает снимок и добавит его в приложение, но он, похоже, не работает. Делает ли UIImageWriteToSavedPhotosAlbum
что-то особенное с imageOrientation
?
Лучшее решение этой проблемы - просто сдуть imageOrientation
, как только пользователь будет сделан с изображением. Я предполагаю, что у Apple есть поворот, сделанный по какой-то причине, не так ли? Несколько человек предположили, что это дефект Apple.
(... если вы еще не потеряли ... Примечание 2: Когда я принять горизонтальное фото, кажется, что все работает отлично, так же, как фотографии, сделанные из Интернета)
EDIT:
Вот некоторые из изображений и сценариев на самом деле. Исходя из комментариев до сих пор, похоже, что это странное поведение - это не просто поведение iPhone, которое, я думаю, хорошо.
Это изображение фотографии я взял с моего телефона (обратите внимание на правильную ориентацию), он появляется именно так, как это было на моем телефоне, когда я щелкнул фото:
Вот что изображение выглядит как в Gmail после того, как я по электронной почте его к себе (выглядит как Gmail обрабатывает его правильно):
Вот что изображение выглядит как эскиз в окнах (не выглядит л икэ он обрабатывается должным образом):
А вот что фактическое изображение выглядит при открытии в Windows Photo Viewer (до сих пор не обрабатываются должным образом):
После всех комментарии по этому вопросу, вот что я думаю ... iPhone берет образ и говорит: «Чтобы отобразить это правильно, его нужно поворачивать на 90 градусов». Эта информация будет в данных EXIF. (Почему его нужно поворачивать на 90 градусов, а не по умолчанию вертикально, я не знаю). Отсюда Gmail достаточно умен, чтобы читать и анализировать данные EXIF и правильно отображать их. Однако Windows недостаточно умна, чтобы читать данные EXIF, и поэтому отображает изображение неправильно. Правильны ли мои предположения?
Интересно ... если это правда, почему образы взяты быть установлен под прямым углом? Я знаю, что это не iPhone-дефект, потому что я заметил подобное поведение, когда друг (с BlackBerry) принимает изображение, а MMS - мне. – Boeckm
Смотрите, как ваша камера записывает метаданные, чтобы повернуть ее на 90 градусов, некоторые операционные системы прочитали, что метаданные и остальные нет. – HarshIT
Довольно хорошо читайте (см. Ниже ответ Хэдли - раньше был в комментарии).Поэтому мое приложение явно должно быть достаточно умным, чтобы обрабатывать изображения, содержащие данные EXIF, а также изображения, которые его не содержат ... Я все еще не понимаю, почему, когда я делаю снимок с правой стороны, флаг ориентации говорит, что он должен вращаться на 90 градусов? – Boeckm