Catatan: Ini hanya berfungsi jika gambar berasal dari domain yang sama dengan halaman, atau memiliki crossOrigin="anonymous"
atribut dan server mendukung CORS. Ini juga tidak akan memberi Anda file asli, tetapi versi yang disandikan ulang. Jika Anda ingin hasilnya identik dengan aslinya, lihat jawaban Kaiido .
Anda harus membuat elemen kanvas dengan dimensi yang benar dan menyalin data gambar dengan drawImage
fungsinya. Kemudian Anda dapat menggunakan toDataURL
fungsi untuk mendapatkan data: url yang memiliki gambar dasar-64 yang disandikan. Perhatikan bahwa gambar harus dimuat sepenuhnya, atau Anda hanya akan mendapatkan kembali gambar kosong (hitam, transparan).
Itu akan menjadi seperti ini. Saya tidak pernah menulis skrip Greasemonkey, jadi Anda mungkin perlu menyesuaikan kode untuk dijalankan di lingkungan itu.
function getBase64Image(img) {
// Create an empty canvas element
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
// Copy the image contents to the canvas
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
// Get the data-URL formatted image
// Firefox supports PNG and JPEG. You could check img.src to
// guess the original format, but be aware the using "image/jpg"
// will re-encode the image.
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}
Mendapatkan gambar berformat JPEG tidak berfungsi pada versi Firefox yang lebih lama (sekitar 3,5), jadi jika Anda ingin mendukungnya, Anda perlu memeriksa kompatibilitasnya. Jika pengkodean tidak didukung, itu akan default ke "image / png".
drawImage
tidak akan melakukan apa-apa, dan Anda akan berakhir dengan kanvas kosong dan gambar yang dihasilkan.Fungsi ini mengambil URL lalu mengembalikan gambar BASE64
Sebut saja seperti ini:
getBase64FromImageUrl("images/slbltxt.png")
sumber
img.src =
mengikutinyaimg.onload =
, karena di beberapa browser, seperti Opera, acara tidak akan terjadi.getBase64FromImageUrl(url)
danimg.onload = function ()
keluar, img tidak dapat dijangkau dan sampah dikumpulkan. Selain IE 6/7 dan ini ok.Datang lama setelah itu, tetapi tidak ada jawaban di sini yang sepenuhnya benar.
Saat digambar di atas kanvas, gambar yang dikirimkan tidak dikompresi + semua telah dikalikan.
Saat diekspor, tidak terkompresi atau dikompresi dengan algoritma yang berbeda, dan tidak dikalikan.
Semua browser dan perangkat akan memiliki kesalahan pembulatan yang berbeda terjadi dalam proses ini
(lihat Kanvas sidik jari ).
Jadi jika seseorang menginginkan versi base64 dari file gambar, mereka harus memintanya lagi (sebagian besar waktu itu akan berasal dari cache) tetapi kali ini sebagai gumpalan.
Kemudian Anda bisa menggunakan FileReader untuk membacanya baik sebagai ArrayBuffer, atau sebagai dataURL.
sumber
XMLHttpRequest cannot load data:image/jpeg;base64,/9j/4AA ... /2Q==. Invalid response. Origin 'https://example.com' is therefore not allowed access.
Versi yang lebih modern dari jawaban Kaiido menggunakan fetch adalah:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Sunting: Seperti yang ditunjukkan dalam komentar, ini akan mengembalikan url objek yang menunjuk ke file di sistem lokal Anda alih-alih DataURL yang sebenarnya, jadi tergantung pada kasus penggunaan Anda, ini mungkin bukan yang Anda butuhkan.
Anda dapat melihat jawaban berikut untuk menggunakan pengambilan dan dataURUR yang sebenarnya: https://stackoverflow.com/a/50463054/599602
sumber
URL.revokeObjectURL()
jika Anda memiliki aplikasi yang berjalan lama menggunakan metode ini, atau memori Anda akan berantakan.shiv / shim / sham
Jika gambar Anda sudah dimuat (atau tidak), "alat" ini mungkin berguna:
.. tapi kenapa?
Ini memiliki keuntungan menggunakan data gambar yang "sudah dimuat", jadi tidak diperlukan permintaan tambahan. Aditionally memungkinkan pengguna akhir (programmer seperti Anda) memutuskan CORS dan / atau
mime-type
danquality
-ATAU- Anda dapat meninggalkan argumen ini / parameter seperti yang dijelaskan dalam MDN spesifikasi di sini .Jika JS Anda dimuat (sebelum saat diperlukan), maka mengonversi ke
dataURL
sesederhana:contoh
HTML
JS
Sidik jari GPU
Jika Anda khawatir tentang "ketepatan" bit maka Anda dapat mengubah alat ini sesuai dengan kebutuhan Anda sebagaimana disediakan oleh jawaban @ Kaiido.
sumber
Gunakan
onload
acara untuk mengonversi gambar setelah memuatTampilkan cuplikan kode
sumber
Di HTML5 lebih baik gunakan ini:
sumber