Протягом останніх кількох тижнів я працював із зображеннями в об’єкті-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, і тому зображення відображається неправильно . Чи правильні мої припущення?