Последние несколько недель я работал с изображениями в объекте-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, и поэтому неправильно отображает изображение . Мои предположения верны?