Selama beberapa minggu terakhir saya telah bekerja dengan gambar di obyektif-c dan memperhatikan banyak perilaku aneh. Pertama, seperti banyak orang lain, saya mengalami masalah ini di mana gambar yang diambil dengan kamera (atau diambil dengan kamera orang lain dan MMS ke saya) diputar 90 derajat. Saya tidak yakin mengapa di dunia ini terjadi (karena itu pertanyaan saya ) tetapi saya dapat menemukan solusi yang murah.
Pertanyaan saya kali ini adalah mengapa ini terjadi ? Mengapa Apple memutar gambar? Ketika saya mengambil foto dengan kamera saya menghadap ke atas, kecuali saya menjalankan kode saya yang disebutkan di atas, ketika saya menyimpan foto, foto itu akan disimpan diputar. Sekarang, solusi saya baik-baik saja hingga beberapa hari yang lalu.
Aplikasi saya memodifikasi piksel individu dari sebuah gambar, khususnya saluran alfa dari PNG (sehingga setiap konversi JPEG dibuang dari jendela untuk skenario saya). Beberapa hari yang lalu saya memperhatikan bahwa meskipun gambar ditampilkan dengan benar di aplikasi saya berkat kode solusi saya, ketika algoritme saya memodifikasi piksel individual gambar, ia mengira gambar itu diputar. Jadi alih-alih memodifikasi piksel di bagian atas gambar, ia memodifikasi piksel di sisi gambar (karena menurutnya itu harus diputar)! Saya tidak tahu cara memutar gambar dalam memori - idealnya saya lebih suka menghapusnyaimageOrientation
semua bendera itu secara bersamaan.
Berikut hal lain yang juga membingungkan saya ... Saat saya mengambil foto, imageOrientation
disetel ke 3. Kode solusi saya cukup pintar untuk menyadari hal ini dan membaliknya sehingga pengguna tidak pernah menyadarinya. Selain itu, kode saya untuk menyimpan gambar ke perpustakaan menyadari hal ini, membaliknya, lalu menyimpannya sehingga muncul di rol kamera dengan benar.
Kode itu terlihat seperti ini:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Ketika saya memuat gambar yang baru disimpan ini ke dalam aplikasi saya, imageOrientation
adalah 0 - persis seperti yang ingin saya lihat, dan solusi rotasi saya bahkan tidak perlu dijalankan (catatan: saat memuat gambar dari internet sebagai kebalikan dari gambar yang diambil dengan kamera , imageOrientation
selalu 0, menghasilkan perilaku yang sempurna). Untuk beberapa alasan, kode penyimpanan saya tampaknya menghapus imageOrientation
bendera ini . Saya berharap untuk mencuri kode itu dan menggunakannya untuk menghapus imageOrientation saya segera setelah pengguna mengambil foto dan menambahkannya ke aplikasi, tetapi tampaknya tidak berhasil. Apakah UIImageWriteToSavedPhotosAlbum
melakukan sesuatu yang istimewa dengan imageOrientation
?
Apakah perbaikan terbaik untuk masalah ini adalah dengan pergi begitu saja imageOrientation
segera setelah pengguna selesai mengambil gambar. Saya berasumsi Apple melakukan perilaku rotasi karena suatu alasan, bukan? Beberapa orang berpendapat bahwa ini adalah cacat Apple.
(... jika Anda belum tersesat ... Note2: Saat saya mengambil foto horizontal, semuanya tampak bekerja dengan sempurna, seperti foto yang diambil dari internet)
EDIT:
Berikut adalah beberapa gambar dan skenario yang sebenarnya terlihat. Berdasarkan komentar selama ini, sepertinya perilaku aneh ini lebih dari sekedar perilaku iPhone, yang menurut saya bagus.
Ini adalah gambar dari foto yang saya ambil dengan ponsel saya (perhatikan orientasi yang benar), itu muncul persis seperti yang terjadi di ponsel saya ketika saya mengambil foto:
Berikut adalah tampilan gambar di Gmail setelah saya mengirimkannya ke email saya sendiri (sepertinya Gmail menanganinya dengan benar):
Berikut adalah tampilan gambar sebagai thumbnail di windows (sepertinya tidak ditangani dengan benar):
Dan inilah tampilan gambar sebenarnya saat dibuka dengan Windows Photo Viewer (masih belum ditangani dengan benar):
Setelah semua komentar tentang pertanyaan ini, inilah yang saya pikirkan ... iPhone mengambil sebuah gambar, dan berkata "untuk menampilkan ini dengan benar, itu perlu diputar 90 derajat". Informasi ini akan ada dalam data EXIF. (Mengapa harus diputar 90 derajat, daripada default ke vertikal lurus, saya tidak tahu). Dari sini, Gmail cukup pintar untuk membaca dan menganalisis data EXIF itu, dan menampilkannya dengan benar. Namun Windows, tidak cukup pintar untuk membaca data EXIF, dan karena itu menampilkan gambar dengan tidak benar . Apakah asumsi saya benar?