Foto kamera digital sering disimpan sebagai JPEG dengan tag "orientasi" EXIF. Untuk menampilkan dengan benar, gambar perlu diputar / dicerminkan tergantung pada orientasi mana yang diatur, tetapi browser mengabaikan informasi ini membuat gambar. Bahkan dalam aplikasi web komersial besar, dukungan untuk orientasi EXIF bisa sangat sulit 1 . Sumber yang sama juga memberikan ringkasan yang bagus tentang 8 orientasi berbeda yang dapat dimiliki JPEG:
Contoh gambar tersedia di 4 .
Pertanyaannya adalah bagaimana memutar / mirror gambar pada sisi klien sehingga ditampilkan dengan benar dan dapat diproses lebih lanjut jika perlu?
Ada pustaka JS yang tersedia untuk mem-parsing data EXIF, termasuk atribut orientasi 2 . Flickr mencatat kemungkinan masalah kinerja saat mem-parsing gambar besar, membutuhkan penggunaan webworkers 3 .
Alat konsol dapat dengan benar mengarahkan ulang gambar 5 . Skrip PHP yang memecahkan masalah tersedia di 6
sumber
canvas.toDataURL()
dan mendekode dan menyimpannya sisi server.<img>
tag biasa ?Transformasi konteks Mederr bekerja dengan sempurna. Jika Anda perlu mengekstrak orientasi, gunakan saja fungsi ini - Anda tidak memerlukan libs pembacaan EXIF. Di bawah ini adalah fungsi untuk mengatur ulang orientasi pada gambar base64. Ini biola untuk itu . Saya juga menyiapkan biola dengan demo ekstraksi orientasi .
sumber
switch
tidak diperlukan, karena transformasi itu tidak melakukan apa-apa. Juga, pertimbangkan untuk menggunakansrcOrientation > 4 && srcOrientation < 9
alih-alih[5,6,7,8].indexOf(srcOrientation) > -1
, karena lebih cepat dan kurang intensif sumber daya (baik RAM & CPU). Tidak perlu memiliki array di sana. Ini penting ketika mengelompokkan banyak gambar, di mana setiap bit dihitung. Kalau tidak, jawabannya cukup bagus. Terpilih!indexOf
membandingkan dengan apa yang Anda usulkan. Saya menjalankan loop sederhana dengan iterasi 10M dan 1400% lebih cepat. Bagus: D Terima kasih banyak!getOrientation
, saya ingin tahu apakah ini efisien dalam hal kinerja.getOrientation
panggilanfileReader.readAsArrayBuffer
, lalu kami panggilURL.createObjectURL
dan berikan hasilnyaresetOrientation
, yang memuat URL ini sebagai gambar. Apakah ini berarti file gambar akan "dimuat" / dibaca oleh browser tidak hanya sekali tetapi dua kali, atau apakah saya salah paham?image-orientation: from-image
saat digunakan.Jika
Kemudian Anda dapat menggunakan transformasi ini untuk mengubah gambar ke orientasi 1
Dari orientasi:
ctx.transform(1, 0, 0, 1, 0, 0);
ctx.transform(-1, 0, 0, 1, width, 0);
ctx.transform(-1, 0, 0, -1, width, height);
ctx.transform(1, 0, 0, -1, 0, height);
ctx.transform(0, 1, 1, 0, 0, 0);
ctx.transform(0, 1, -1, 0, height, 0);
ctx.transform(0, -1, -1, 0, height, width);
ctx.transform(0, -1, 1, 0, 0, width);
Sebelum menggambar gambar pada ctx
sumber
ok selain jawaban @ user3096626 saya pikir akan lebih membantu jika seseorang memberikan contoh kode, contoh berikut ini akan menunjukkan kepada Anda bagaimana cara memperbaiki orientasi gambar berasal dari url (gambar jarak jauh):
Solusi 1: menggunakan javascript (disarankan)
karena pustaka load-image tidak mengekstraksi tag exif hanya dari gambar url (file / blob), kami akan menggunakan pustaka javascript exif-js dan load-image , jadi pertama-tama tambahkan pustaka ini ke halaman Anda sebagai berikut:
Perhatikan bahwa versi 2.2 dari exif-js tampaknya memiliki masalah sehingga kami menggunakan 2.1
maka pada dasarnya apa yang akan kita lakukan adalah
a - memuat gambar menggunakan
window.loadImage()
b - baca tag exif menggunakan
window.EXIF.getData()
c - ubah gambar menjadi kanvas dan perbaiki orientasi gambar menggunakan
window.loadImage.scale()
d - tempatkan kanvas ke dalam dokumen
ini dia :)
tentu saja Anda juga bisa mendapatkan gambar sebagai base64 dari objek kanvas dan letakkan di atribut img src, jadi dengan menggunakan jQuery Anda bisa melakukannya;)
di sini adalah kode lengkap di: github: https://github.com/digital-flowers/loadimage-exif-example
Solusi 2: menggunakan html (peretasan browser)
ada peretasan yang sangat cepat dan mudah, sebagian besar peramban menampilkan gambar dalam orientasi yang benar jika gambar dibuka di dalam tab baru secara langsung tanpa html (LOL saya tidak tahu mengapa), jadi pada dasarnya Anda dapat menampilkan gambar Anda menggunakan iframe dengan menempatkan atribut iframe src sebagai url gambar secara langsung:
Solusi 3: menggunakan css (hanya firefox & safari di ios)
ada atribut css3 untuk memperbaiki orientasi gambar tetapi masalahnya hanya bekerja pada firefox dan safari / ios masih layak disebutkan karena segera akan tersedia untuk semua browser (Info dukungan browser dari caniuse )
sumber
Bagi mereka yang memiliki file dari kontrol input, tidak tahu apa orientasinya, agak malas dan tidak ingin memasukkan perpustakaan besar di bawah ini adalah kode yang disediakan oleh @WunderBart menyatu dengan jawaban yang ia tautkan ( https://stackoverflow.com/a/32490603 ) yang menemukan orientasi.
yang bisa dengan mudah disebut seperti itu
sumber
image/jpeg
alih-alih defaultimage/png
, dan mengubah ukuran gambar output ke lebar maksimum (400px dalam kasus saya) membuat perbedaan besar. (ini berfungsi dengan baik untuk thumbnail, tetapi jika Anda harus menampilkan gambar penuh, saya sarankan menghindari base64 dan cukup menyuntikkan elemen kanvas langsung ke halaman ...)Jawaban WunderBart adalah yang terbaik untuk saya. Perhatikan bahwa Anda dapat mempercepatnya banyak jika gambar Anda sering berada di jalur yang benar, cukup dengan menguji orientasi terlebih dahulu dan melewati sisa kode jika tidak diperlukan rotasi.
Menyatukan semua info dari wunderbart, sesuatu seperti ini;
sumber
-2
dan-1
kembali darigetOrientation
sehingga Anda tidak mencoba untuk memutar non-jpg atau gambar tanpa data rotasi.file.slice()
pengoptimalan Anda , tetapi dorongan sebenarnya berasal dari penggunaan gambar yang lebih kecil danimage/jpeg
format keluaran untuk membuat URL data yang lebih kecil. (tidak ada penundaan nyata bahkan untuk gambar 10-megapiksel.)file.slice()
, karena Anda akan mencegah dukungan sumber gambar base64.Satu liner, siapa pun?
Saya belum melihat ada yang menyebutkan
browser-image-compression
perpustakaan . Ada fungsi pembantu yang sempurna untuk ini.Pemakaian:
const orientation = await imageCompression.getExifOrientation(file)
Alat yang bermanfaat dalam banyak hal juga.
sumber
File
objek sejauh yang saya tahu. Hal terbaik berikutnya adalah mengirim gambar dan orientasi ke server, dan melakukan manipulasi file di sana. Atau Anda bisa membuat string base64 menggunakancanvas
dantoDataURL
metode.Saya membuat kelas yang dibungkus dengan modul ES6 yang memecahkan persis ini.
Ini 103 baris, tidak ada dependensi, dan terstruktur dan didokumentasikan dengan cukup baik, dimaksudkan untuk mudah dimodifikasi / digunakan kembali.
Menangani semua 8 kemungkinan orientasi, dan berbasis pada Janji.
Ini dia, semoga ini masih membantu seseorang: https://gist.github.com/vdavid/3f9b66b60f52204317a4cc0e77097913
sumber
Saya menggunakan solusi campuran (php + css).
Wadah diperlukan untuk:
div.imgCont2
wadah yang dibutuhkan untuk memutar;div.imgCont1
wadah yang diperlukan untuk zoomout -width:150%
;div.imgCont
diperlukan wadah untuk scrollbar, ketika gambar zoomOut..
sumber
Selain jawaban @fareed namrouti,
Ini harus digunakan jika gambar harus diakses dari elemen input file
sumber
Saya telah menulis skrip php kecil yang memutar gambar. Pastikan untuk menyimpan gambar demi hanya menghitung ulang setiap permintaan.
Bersulang
sumber