В течение последних нескольких недель я работал с изображениями в objective-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
. Я надеялся просто украсть этот код и использовать его, чтобы уничтожить мой образОриентации, как только пользователь сделает снимок и добавит его в приложение, но он, похоже, не работает. UIImageWriteToSavedPhotosAlbum
делает что-то особенное с imageOrientation
?
Лучшим решением этой проблемы будет просто сдуть imageOrientation
, как только пользователь сделает съемку. Я предполагаю, что у Apple есть поворот, сделанный по какой-то причине, не так ли? Несколько человек предположили, что это дефект Apple.
(... если вы еще не потерялись... Примечание2: Когда я снимаю горизонтальную фотографию, все работает отлично, точно так же, как фотографии, сделанные из Интернета)
EDIT:
Вот некоторые из изображений и сценариев на самом деле. Исходя из комментариев до сих пор, похоже, что это странное поведение - это не просто поведение iPhone, которое, я думаю, хорошо.
Это фотография фотографии, которую я взял с моим телефоном (обратите внимание на правильную ориентацию), она отображается точно так же, как на моем телефоне, когда я щелкнул фотографию:
Вот как выглядит изображение в Gmail после того, как я отправил его по электронной почте самому себе (похоже, что Gmail обрабатывает его правильно):
Вот как выглядит изображение в виде миниатюры в окнах (похоже, что оно не обрабатывается должным образом):
И вот как выглядит фактическое изображение при открытии с помощью Windows Photo Viewer (все еще не обрабатывается должным образом):
После всех комментариев по этому вопросу, вот что я думаю... iPhone берет изображение и говорит "чтобы правильно отобразить его, его нужно поворачивать на 90 градусов". Эта информация будет в данных EXIF. (Почему его нужно поворачивать на 90 градусов, а не по умолчанию вертикально, я не знаю). Отсюда Gmail достаточно умен, чтобы читать и анализировать данные EXIF и правильно отображать их. Однако Windows недостаточно интеллектуальна для чтения данных EXIF и поэтому отображает изображение неправильно. Правильны ли мои предположения?