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?
sumber
Jawaban:
Saya melakukan R&D di atasnya dan menemukan, setiap file gambar memiliki properti metadata. Jika metadata menentukan orientasi gambar yang umumnya diabaikan oleh OS lain selain Mac. Sebagian besar gambar yang diambil memiliki properti meta data yang disetel ke sudut kanan. Jadi Mac menunjukkannya dengan cara diputar 90 derajat. Anda dapat melihat gambar yang sama dengan cara yang benar di OS windows.
Untuk detail lebih lanjut, baca jawaban ini http://graphicssoft.about.com/od/digitalphotography/f/sideways-pictures.htm
coba baca exif gambar Anda di sini http://www.exifviewer.org/ , atau http://regex.info/exif.cgi , atau http://www.addictivetips.com/internet-tips/view-complete-exif -metadata-informasi-dari-apapun-gambar-jpeg-online /
sumber
Saya memiliki masalah yang sama ketika saya mendapatkan gambar dari Kamera, saya meletakkan kode berikut untuk memperbaikinya .. Menambahkan metode scaleAndRotateImage dari sini
sumber
Salin / tempel cepat terjemahan cepat dari jawaban luar biasa Dilip .
sumber
Jawabannya sangat sederhana. Apple TIDAK memutar gambar. Di situlah letak kebingungan.
Kamera CCD tidak berputar, jadi selalu mengambil foto dalam mode lanskap.
Apple melakukan hal yang sangat cerdas - alih-alih menghabiskan seluruh waktu untuk memutar gambar - mengacak beberapa megabyte data - cukup tandai dengan BAGAIMANA gambar itu diambil.
OpenGL melakukan terjemahan dengan sangat mudah - sehingga DATA tidak pernah terseok-seok - CARA DITARIK.
Oleh karena itu meta data orientasi.
Ini menjadi masalah jika Anda ingin memotong, mengubah ukuran, dll - tetapi begitu Anda tahu apa yang terjadi, Anda tinggal menentukan matriks Anda dan semuanya berhasil.
sumber
Versi Swift 4 dengan pemeriksaan keamanan jawaban Dilip .
sumber
(bounds.size.height, bounds.size.width) = (bounds.size.width, bounds.size.height)
tanpa membuat variabel sebagai penyimpanan.bounds.size.height.round()
danbounds.size.width.round()
Gambar apa pun yang dihasilkan oleh iPhone / iPad disimpan sebagai Landscape Left dengan tag Orientasi EXIF (Exif.Image.Orientation) yang menentukan orientasi sebenarnya.
Ini memiliki nilai berikut: 1: Landscape Left 6: Portrait Normal 3: Landscape Right 4: Portrait Upside Down
Di IOS, info EXIF dibaca dengan benar dan gambar ditampilkan dengan cara yang sama seperti saat diambil. Namun di Windows, info EXIF TIDAK digunakan.
Jika Anda membuka salah satu gambar ini di GIMP, itu akan mengatakan bahwa gambar tersebut memiliki info rotasi.
sumber
Untuk siapa pun yang menggunakan Xamarin, berikut terjemahan C # dari jawaban hebat Dilip , dan terima kasih kepada thattyson untuk terjemahan Swift .
sumber
Saya menemukan pertanyaan ini karena saya mengalami masalah yang sama, tetapi menggunakan Swift. Hanya ingin menautkan ke jawaban yang berhasil bagi saya untuk pengembang Swift lainnya: https://stackoverflow.com/a/26676578/3904581
Berikut cuplikan Swift yang memperbaiki masalah secara efisien:
Sangat sederhana. Satu baris kode. Masalah terpecahkan.
sumber
Saya tahu persis apa masalah Anda. Anda menggunakan UIImagePicker, yang dalam segala hal aneh. Saya menyarankan Anda menggunakan AVFoundation untuk kamera yang memberikan fleksibilitas dalam orientasi serta kualitas. Gunakan AVCaptureSession. Anda bisa mendapatkan kodenya di sini. Bagaimana cara menyimpan foto yang diambil menggunakan AVFoundation ke Album Foto?
sumber
Dengan cepat direfraktorisasi untuk Swift 3 (dapatkah seseorang mengujinya dan mengonfirmasi bahwa semuanya berfungsi dengan baik?):
sumber
Ini adalah versi Swift3 dari jawaban mengagumkan Dilip
sumber
Coba ubah format gambar menjadi .jpeg. Ini berhasil untuk saya
sumber