satu pertanyaan lagi, bagaimana saya bisa menyimpan gambar yang saya dapatkan di tag ini ke server. Tebak ??
Surya
7
Tetapi jika saya menggunakan var img = canvas.toDataURL ("image / jpeg"); Saya mendapatkan latar belakang sebagai hitam lengkap. Bagaimana cara memperbaikinya
gauti
181
Oh ayolah. Saya menjawab ini pada tahun 2009. Apa yang Anda harapkan?
donohoe
35
@donohoe sebenarnya Anda menjawabnya pada Agustus 2010 :)
nick
13
Itu akan menggunakan memori jauh lebih sedikit untuk melakukan sesuatu seperti var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);. The document.writekode membuat URL data, mereka membuat string HTML, kemudian menempatkan salinan string yang di DOM, browser kemudian harus mengurai bahwa string HTML, menempatkan salinan lain pada elemen gambar, kemudian mengurai lagi untuk menghidupkan URL data menjadi data gambar, lalu akhirnya bisa menampilkan gambar. Untuk gambar ukuran layar, itu adalah memori / penyalinan / parsing yang sangat besar. Hanya sebuah saran
gman
116
HTML5 menyediakan Canvas.toDataURL (mimetype) yang diimplementasikan di Opera, Firefox, dan Safari 4 beta. Namun ada beberapa batasan keamanan (sebagian besar berkaitan dengan menggambar konten dari asal lain ke kanvas).
Jadi Anda tidak perlu perpustakaan tambahan.
misalnya
<canvas id=canvas width=200 height=200></canvas><script>
window.onload =function(){var canvas = document.getElementById("canvas");var context = canvas.getContext("2d");
context.fillStyle ="green";
context.fillRect(50,50,100,100);// no argument defaults to image/png; image/jpeg, etc also work on some// implementations -- image/png is the only one that must be supported per spec.
window.location = canvas.toDataURL("image/png");}</script>
Secara teoritis ini harus membuat dan kemudian menavigasi ke gambar dengan kotak hijau di tengahnya, tapi saya belum menguji.
Di mana gambar akan disimpan. Lokasi di lokal saya?
chinna_82
5
gambar akan ditampilkan sebagai gambar di browser Anda. Anda kemudian dapat menyimpannya ke disk atau apa pun. Berikut adalah bookmarklet generik yang cepat dan kotor "Canvas2PNG" yang mengubah kanvas pertama di halaman menjadi PNG dan menampilkannya di browser di jendela baru:javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Kai Carver
Jika ukuran gambarnya beberapa MB, bersiaplah untuk menghancurkan browser Anda (saya pernah melakukannya di FireFox).
jahu
1
Bagaimana ini bisa dimodifikasi untuk membuat beberapa gambar?
Mentalist
URI data memiliki panjang maksimal, sehingga ada batas atas pada ukuran gambar yang dapat Anda tempatkan ke url data.
Juha Syrjälä
44
Saya pikir saya akan sedikit memperluas cakupan pertanyaan ini, dengan beberapa informasi berguna tentang masalah ini.
Untuk mendapatkan kanvas sebagai gambar, Anda harus melakukan hal berikut:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png");
Anda dapat menggunakan ini untuk menulis gambar ke halaman:
document.write('<img src="'+image+'"/>');
Di mana "image / png" adalah tipe mime (png adalah satu-satunya yang harus didukung). Jika Anda ingin array tipe yang didukung, Anda dapat melakukan sesuatu di sepanjang baris ini:
var imageMimes =['image/png','image/bmp','image/gif','image/jpeg','image/tiff'];//Extend as necessary var acceptedMimes =newArray();for(i =0; i < imageMimes.length; i++){if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0){
acceptedMimes[acceptedMimes.length]= imageMimes[i];}}
Anda hanya perlu menjalankan ini sekali per halaman - itu tidak akan pernah berubah melalui siklus hidup halaman.
Jika Anda ingin membuat pengguna mengunduh file saat disimpan, Anda dapat melakukan hal berikut:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png").replace("image/png","image/octet-stream");//Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;
Jika Anda menggunakannya dengan tipe mime yang berbeda, pastikan untuk mengubah kedua instance gambar / png, tetapi tidak untuk image / octet-stream. Perlu juga disebutkan bahwa jika Anda menggunakan sumber daya lintas-domain dalam merender kanvas Anda, Anda akan menemukan kesalahan keamanan ketika Anda mencoba menggunakan metode toDataUrl.
Dengan solusi Anda untuk mengunduh file, saya harus memilih perangkat lunak yang ingin saya gunakan, ini agak tidak nyaman ... Apakah ada cara untuk mengganti kembali mime sebagai png setelah diunduh?
So4ne
1
@ So4ne Saya tidak berpikir begitu, itu harus berupa image / octet-stream untuk meminta pengguna mengunduh. Jika Anda menghilangkan garis itu, Anda akan berakhir dengan halaman yang diarahkan ke gambar. Saya ingin tahu apakah ada orang lain yang tahu cara melakukan ini dengan baik.
meiamsome
2
menggunakan target = "_ blank" pada tautan <a> dan .click () itu akan berfungsi juga untuk memicu unduhan (diuji dengan FF data-url dan unduh = "nama file" untuk teks / csv dan teks / polos)
Ax3l
Ini bagus. Terima kasih! Tetapi bagaimana jika saya ingin menyimpan ke server dan bukan lokal? Apakah input file formulir menerima img src sebagai sesuatu yang dapat diunggah?
File yang disimpan tetap dalam format .svg. Bagaimana cara menyimpannya sebagai png?
nullpointer
Ini adalah solusi yang bagus kecuali itu mungkin tidak berfungsi pada IE. Mendapatkan kesalahan "Area data yang diteruskan ke panggilan sistem terlalu kecil"
Jose Cherian
Di Chrome dikatakan "Kesalahan jaringan", sementara di Firefox berfungsi dengan baik. (Di Linux)
Ecker00
20
Saya akan menggunakan " wkhtmltopdf ". Itu hanya bekerja dengan baik. Ini menggunakan mesin webkit (digunakan di Chrome, Safari, dll.), Dan sangat mudah digunakan:
Saya di kamp wkhtmltopdf juga. Kami telah menggunakannya untuk pengarsipan dan AMAZING.
Daniel Szabo
Bagaimana cara menggunakan WKHTMLtoPDF di halaman yang memerlukan info masuk? Saya menggunakan Jsreport untuk mengonversi ke PDF tapi saya menangkap konten saya dengan HTML2Canvas, saya memiliki masalah dengan mengirimkan Kanvas sebagai parameter ke JSreport
Berikut ini beberapa bantuan jika Anda melakukan pengunduhan melalui server (dengan cara ini Anda dapat memberi nama / konversi / pasca-proses / dll file Anda):
Solusi menarik lainnya adalah PhantomJS . Ini adalah skrip WebKit tanpa kepala dengan JavaScript atau CoffeeScript.
Salah satu kasus penggunaannya adalah tangkapan layar: Anda dapat secara terprogram menangkap konten web, termasuk SVG dan Kanvas dan / atau Buat tangkapan layar situs web dengan pratinjau thumbnail.
+1: PhantomJS adalah sistem yang sederhana, terdokumentasi dengan baik dan dipikirkan dengan matang, sempurna untuk pekerjaan ini. Ini memungkinkan lebih dari sekedar mengambil kanvas juga - misalnya, Anda dapat memodifikasi halaman atau bagian dari itu (melalui JS) sebelum mengambilnya sehingga membuatnya terlihat seperti yang Anda inginkan. Sempurna!
johndodo
1
PhantomJs sekarang sudah usang
Merc
3
Jika Anda menggunakan jQuery, yang dilakukan banyak orang, maka Anda akan menerapkan jawaban yang diterima seperti:
var canvas = $("#mycanvas")[0];var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
Solusi jQuery murni (100%) adalah sebagai berikut: $('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());Persis satu baris.
Naeel Maqsudov
1
Anda dapat menggunakan jspdf untuk menangkap kanvas ke dalam gambar atau pdf seperti ini:
var imgData = canvas.toDataURL('image/png');var doc =new jsPDF('p','mm');
doc.addImage(imgData,'PNG',10,10);
doc.save('sample-file.pdf');
Ini adalah cara lain, tanpa ikatan meskipun saya tidak benar-benar tahu apakah lebih cepat atau tidak. Alih-alih toDataURL (karena semua pertanyaan di sini mengusulkan). Dalam kasus saya ingin mencegah dataUrl / base64 karena saya memerlukan buffer atau view Array. Jadi metode lain dalam HTMLCanvasElement adalah toBlob. (Fungsi TypeScript):
exportfunction canvasToArrayBuffer(canvas:HTMLCanvasElement, mime: string):Promise<ArrayBuffer>{returnnewPromise((resolve, reject)=> canvas.toBlob(async(d)=>{if(d){const r =newFileReader();
r.addEventListener('loadend', e =>{const ab = r.result;if(ab){
resolve(ab as ArrayBuffer);}else{
reject(newError('Expected FileReader result'));}}); r.addEventListener('error', e =>{
reject(e)});
r.readAsArrayBuffer(d);}else{
reject(newError('Expected toBlob() to be defined'));}}, mime));}
Keuntungan lain dari blob adalah Anda dapat membuat ObjectUrls untuk merepresentasikan data sebagai file, mirip dengan anggota 'file' HTMLInputFile. Info lebih lanjut:
Jawaban:
Ups. Jawaban asli khusus untuk pertanyaan serupa. Ini telah direvisi:
dengan nilai dalam IMG Anda dapat menuliskannya sebagai Gambar baru seperti:
sumber
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
. Thedocument.write
kode membuat URL data, mereka membuat string HTML, kemudian menempatkan salinan string yang di DOM, browser kemudian harus mengurai bahwa string HTML, menempatkan salinan lain pada elemen gambar, kemudian mengurai lagi untuk menghidupkan URL data menjadi data gambar, lalu akhirnya bisa menampilkan gambar. Untuk gambar ukuran layar, itu adalah memori / penyalinan / parsing yang sangat besar. Hanya sebuah saranHTML5 menyediakan Canvas.toDataURL (mimetype) yang diimplementasikan di Opera, Firefox, dan Safari 4 beta. Namun ada beberapa batasan keamanan (sebagian besar berkaitan dengan menggambar konten dari asal lain ke kanvas).
Jadi Anda tidak perlu perpustakaan tambahan.
misalnya
Secara teoritis ini harus membuat dan kemudian menavigasi ke gambar dengan kotak hijau di tengahnya, tapi saya belum menguji.
sumber
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Saya pikir saya akan sedikit memperluas cakupan pertanyaan ini, dengan beberapa informasi berguna tentang masalah ini.
Untuk mendapatkan kanvas sebagai gambar, Anda harus melakukan hal berikut:
Anda dapat menggunakan ini untuk menulis gambar ke halaman:
Di mana "image / png" adalah tipe mime (png adalah satu-satunya yang harus didukung). Jika Anda ingin array tipe yang didukung, Anda dapat melakukan sesuatu di sepanjang baris ini:
Anda hanya perlu menjalankan ini sekali per halaman - itu tidak akan pernah berubah melalui siklus hidup halaman.
Jika Anda ingin membuat pengguna mengunduh file saat disimpan, Anda dapat melakukan hal berikut:
Jika Anda menggunakannya dengan tipe mime yang berbeda, pastikan untuk mengubah kedua instance gambar / png, tetapi tidak untuk image / octet-stream. Perlu juga disebutkan bahwa jika Anda menggunakan sumber daya lintas-domain dalam merender kanvas Anda, Anda akan menemukan kesalahan keamanan ketika Anda mencoba menggunakan metode toDataUrl.
sumber
sumber
Saya akan menggunakan " wkhtmltopdf ". Itu hanya bekerja dengan baik. Ini menggunakan mesin webkit (digunakan di Chrome, Safari, dll.), Dan sangat mudah digunakan:
Itu dia!
Cobalah
sumber
Berikut ini beberapa bantuan jika Anda melakukan pengunduhan melalui server (dengan cara ini Anda dapat memberi nama / konversi / pasca-proses / dll file Anda):
-Post data menggunakan
toDataURL
-Mengatur header
-membuat gambar
Gambar -ekspor sebagai JPEG
-atau PNG transparan
sumber
Solusi menarik lainnya adalah PhantomJS . Ini adalah skrip WebKit tanpa kepala dengan JavaScript atau CoffeeScript.
Salah satu kasus penggunaannya adalah tangkapan layar: Anda dapat secara terprogram menangkap konten web, termasuk SVG dan Kanvas dan / atau Buat tangkapan layar situs web dengan pratinjau thumbnail.
Titik masuk terbaik adalah halaman wiki tangkapan layar .
Ini adalah contoh yang bagus untuk jam polar (dari RaphaelJS):
Apakah Anda ingin merender halaman ke PDF?
sumber
Jika Anda menggunakan jQuery, yang dilakukan banyak orang, maka Anda akan menerapkan jawaban yang diterima seperti:
sumber
.toDataURL
adalah asli JS.$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
Persis satu baris.Anda dapat menggunakan jspdf untuk menangkap kanvas ke dalam gambar atau pdf seperti ini:
Info lebih lanjut: https://github.com/MrRio/jsPDF
sumber
Ini adalah cara lain, tanpa ikatan meskipun saya tidak benar-benar tahu apakah lebih cepat atau tidak. Alih-alih toDataURL (karena semua pertanyaan di sini mengusulkan). Dalam kasus saya ingin mencegah dataUrl / base64 karena saya memerlukan buffer atau view Array. Jadi metode lain dalam HTMLCanvasElement adalah
toBlob
. (Fungsi TypeScript):Keuntungan lain dari blob adalah Anda dapat membuat ObjectUrls untuk merepresentasikan data sebagai file, mirip dengan anggota 'file' HTMLInputFile. Info lebih lanjut:
https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob
sumber
Pada beberapa versi Chrome, Anda dapat:
ctx.drawImage(image1, 0, 0, w, h);
sumber