Apakah ada cara untuk merender html ke gambar seperti PNG? Saya tahu itu mungkin dengan kanvas tetapi saya ingin membuat elemen html standar seperti div misalnya.
Untuk membuat semacam bantuan pengguna, misalnya. Sayangnya, itu tidak mungkin (untuk alasan keamanan?). Anda harus meminta pengguna untuk menekan PrintScreen untuk melakukan sesuatu.
Saya ingin menggunakan HTML / CSS untuk mendesain logo.
Martin Delille
4
@ ErnestFriedman-Hill bukan duplikat: pertanyaan yang Anda sebutkan khusus untuk java.
Martin Delille
Berikut ini adalah tutorial Langkah demi Langkah untuk Mengubah HTML ke IMAGE png atau format jpeg codepedia.info/2016/02/...
Satinder singh
Jawaban:
41
Saya tahu ini adalah pertanyaan lama yang sudah memiliki banyak jawaban, namun saya masih menghabiskan waktu berjam-jam untuk benar-benar melakukan apa yang saya inginkan:
diberi file html, hasilkan gambar (png) dengan latar belakang transparan dari baris perintah
Menggunakan Chrome headless (versi 74.0.3729.157 pada respons ini), sebenarnya mudah:
Tampaknya menarik tetapi saya tidak berhasil membuatnya jadi saya memilih solusi John Fisher. Terima kasih atas informasinya, saya akan menonton proyek ini di masa depan!
Martin Delille
@ MartinDelille: di sini artikel menggunakan HTML2Canvas untuk membuat IMAGE dan Anda juga dapat mengunduhnya di sisi klien codepedia.info/2016/02/...
Satinder singh
3
dom-to-image (lihat jawaban tsayen) melakukan pekerjaan yang jauh lebih baik untuk membuat gambar yang akurat.
JBE
3
Solusi ini sangat lambat
hamboy75
3
masalah lain, jika elemen itu tersembunyi atau di belakang elemen lain ini tidak akan berfungsi
Yousef
91
Bolehkah saya merekomendasikan perpustakaan dom-ke-gambar , yang ditulis semata-mata untuk mengatasi masalah ini (saya pengelola).
Inilah cara Anda menggunakannya (beberapa lagi di sini ):
var node = document.getElementById('my-node');
domtoimage.toPng(node).then (function(dataUrl){var img =newImage();
img.src = dataUrl;
document.appendChild(img);}).catch(function(error){
console.error('oops, something went wrong!', error);});
Ini bagus! Adakah cara untuk menggandakan ukuran output?
cronoklee
Terima kasih! Tapi apa sebenarnya yang Anda maksud dengan "menggandakan ukuran"?
tsayen
2
Hal pertama yang terlintas di pikiran saya - coba render gambar Anda ke SVG (menggunakan domtoimage.toSvg ), lalu render sendiri di atas kanvas dan cobalah untuk bermain dengan resolusi kanvas itu. Mungkin saja untuk mengimplementasikan fitur seperti semacam opsi rendering di lib itu sendiri, sehingga Anda dapat melewatkan dimensi gambar dalam piksel. Jika Anda membutuhkannya, saya menghargai Anda membuat masalah di github.
tsayen
8
Ini JAUH lebih baik daripada html2canvas. Terima kasih.
c.hughes
1
@ Subo itu adalah String yang berisi URL dengan data yang disandikan base64
tsayen
66
Ada banyak pilihan dan mereka semua memiliki pro dan kontra.
Opsi 1: Gunakan salah satu dari banyak perpustakaan yang tersedia
Terima kasih atas jawaban terinci dengan banyak solusi yang memungkinkan
bszom
wkhtmltoimage / pdf mendukung rendering javascript. Anda dapat mengatur penundaan javascript atau biarkan wkhtml memeriksa window.status specifc (yang dapat Anda atur dengan javascript saat Anda tahu barang js Anda selesai)
Daniel Z.
PhantomJS mendukung hal-hal dinamis seperti Google Maps. Ini benar-benar browser web lengkap, hanya tanpa layar terpasang. Namun Anda harus menunggu sedikit agar Google Map memuat ubin dengan geografi (Saya menunggu 500ms dan memungkinkan orang untuk mengubah penundaan - jika itu tidak cukup, berjalan lagi tanpa menambah waktu baik-baik saja, karena ubin itu di-cache).
Ladislav Zima
50
Semua jawaban di sini menggunakan perpustakaan pihak ketiga saat merender HTML ke gambar bisa relatif sederhana dalam Javascript murni. Ada yang bahkan sebuah artikel tentang hal itu pada bagian kanvas di MDN.
Kuncinya adalah ini:
buat SVG dengan simpul foreignObject yang berisi XHTML Anda
Demi alasan keamanan, SVG sebagai url data gambar berfungsi sebagai ruang lingkup CSS yang terisolasi untuk HTML karena tidak ada sumber eksternal yang dapat dimuat. Jadi font Google misalnya harus digarisbawahi menggunakan alat seperti ini .
Bahkan ketika HTML di dalam SVG melebihi ukuran gambar, ia akan menggambar ke kanvas dengan benar. Tetapi ketinggian sebenarnya tidak dapat diukur dari gambar itu. Solusi ketinggian tetap akan bekerja dengan baik tetapi ketinggian dinamis akan membutuhkan sedikit lebih banyak pekerjaan. Yang terbaik adalah merender data SVG menjadi iframe (untuk lingkup CSS terisolasi) dan menggunakan ukuran yang dihasilkan untuk kanvas.
Bagus! Menghapus ketergantungan perpustakaan eksternal memang cara yang baik untuk pergi. Saya mengubah jawaban yang saya terima :-)
Martin Delille
Artikel itu sudah tidak ada lagi.
MSC
2
Jawaban yang bagus, tetapi mengomentari keadaan seni HTML dan Web API, yang seperti biasa terlihat seperti sesuatu yang menarik seseorang di belakang - semua fungsionalitas ada secara teknis tetapi diekspos di belakang array (tanpa kata-kata dimaksudkan) dari jalur kode aneh yang menyerupai tidak ada kejelasan yang Anda harapkan dari API yang dirancang dengan baik. Dalam plainspeak: kemungkinan besar sepele untuk browser untuk memungkinkan Documentuntuk dirender menjadi raster (misalnya a Canvas), tetapi karena tidak ada yang peduli untuk membakukannya, kita harus menggunakan kegilaan seperti diilustrasikan di atas (jangan tersinggung oleh penulis ini) kode).
amn
1
Jawaban ini stackoverflow.com/questions/12637395/… sepertinya mengindikasikan Anda bisa melangkah terlalu jauh. Mozilla dan Chrome memiliki panjang data tak terbatas dan bahkan IE saat ini memungkinkan 4GB, yang bermuara di sekitar 3GB gambar (karena base64). Tetapi ini akan menjadi hal yang baik untuk diuji.
Sjeiti
3
- beberapa tes cepat dan kotor nanti - jsfiddle.net/Sjeiti/pcwudrmc/75965 Chrome, Edge dan Firefox naik ke ketinggian lebar setidaknya 10.000 piksel yang (dalam hal ini) adalah jumlah karakter sekitar 10.000.000 dan ukuran file png 8MB. Belum diuji dengan ketat tetapi cukup untuk sebagian besar kasus penggunaan.
Sjeiti
13
Anda bisa menggunakan PhantomJS , yang merupakan webkit tanpa kepala (mesin rendering di safari dan (hingga baru-baru ini) driver chrome). Anda dapat mempelajari cara melakukan tangkapan layar halaman di sini . Semoga itu bisa membantu!
Teknik ini bekerja dengan baik. Namun, 2 tahun telah berlalu sejak komentar Anda. Sudahkah Anda menemukan sesuatu yang beroperasi lebih cepat dari PhantomJS? Pembuatan Gambar biasanya memakan waktu 2-5 detik di Phantom, menurut pengalaman saya.
Brian Webster
Chrome tanpa kepala sekarang mungkin. Saya tidak tahu apakah ini lebih cepat, tetapi jika Anda ingin tangkapan layar yang akurat, ini adalah cara yang baik untuk melakukannya.
Josh Maag
11
Anda dapat menggunakan alat HTML ke PDF seperti wkhtmltopdf. Dan kemudian Anda dapat menggunakan alat PDF untuk gambar seperti imagemagick. Memang ini adalah sisi server dan proses yang sangat berbelit-belit ...
Atau Anda bisa menjalankan image saudara wkhtmltopdf, wkhtmltoimage.
Roman Starkov
1
Perpustakaan ini untuk Node.js. Bagaimana dengan frontend sederhana?
Vlad
9
Satu-satunya perpustakaan yang saya gunakan untuk Chrome, Firefox, dan MS Edge adalah rasterizeHTML . Ini menghasilkan kualitas yang lebih baik daripada HTML2Canvas dan masih didukung tidak seperti HTML2Canvas.
Saya tidak berharap ini menjadi jawaban terbaik, tetapi sepertinya cukup menarik untuk dikirim.
Tulis aplikasi yang membuka browser favorit Anda ke dokumen HTML yang diinginkan, ukuran jendela dengan benar, dan mengambil screenshot. Kemudian, hapus batas gambar.
Apakah Anda memiliki versi cepat di atas? atau jika mungkin bisakah Anda menulis ulang?
ssh
Maukah Anda berbagi kode yang Anda gunakan untuk memuat webView yang Anda render? Ini sepertinya pendekatan yang menjanjikan untuk penyaji thumbnail saya. Terima kasih!
Dave
1
Instal phantomjs
$ npm install phantomjs
Buat file github.js dengan kode berikut
var page = require('webpage').create();//viewportSize being the actual size of the headless browser
page.viewportSize ={ width:1024, height:768};
page.open('http://github.com/',function(){
page.render('github.png');
phantom.exit();});
Jawaban:
Saya tahu ini adalah pertanyaan lama yang sudah memiliki banyak jawaban, namun saya masih menghabiskan waktu berjam-jam untuk benar-benar melakukan apa yang saya inginkan:
Menggunakan Chrome headless (versi 74.0.3729.157 pada respons ini), sebenarnya mudah:
Penjelasan perintah:
--headless
menjalankan Chrome tanpa membukanya dan keluar setelah perintah selesai--screenshot
akan menangkap tangkapan layar (perhatikan bahwa itu menghasilkan file yang disebutscreenshot.png
di folder tempat perintah dijalankan)--window-size
memungkinkan untuk hanya mengambil sebagian dari layar (formatnya--window-size=width,height
)--default-background-color=0
adalah trik sulap yang memberi tahu Chrome untuk menggunakan latar belakang transparan , bukan warna putih defaultsumber
--screenshot='absolute\path\of\screenshot.png'
bekerja untuk sayaIya. HTML2Canvas ada untuk merender HTML
<canvas>
(yang kemudian dapat Anda gunakan sebagai gambar).CATATAN: Ada masalah yang diketahui, bahwa ini tidak akan berfungsi dengan SVG
sumber
Bolehkah saya merekomendasikan perpustakaan dom-ke-gambar , yang ditulis semata-mata untuk mengatasi masalah ini (saya pengelola).
Inilah cara Anda menggunakannya (beberapa lagi di sini ):
sumber
domtoimage.toSvg
), lalu render sendiri di atas kanvas dan cobalah untuk bermain dengan resolusi kanvas itu. Mungkin saja untuk mengimplementasikan fitur seperti semacam opsi rendering di lib itu sendiri, sehingga Anda dapat melewatkan dimensi gambar dalam piksel. Jika Anda membutuhkannya, saya menghargai Anda membuat masalah di github.Ada banyak pilihan dan mereka semua memiliki pro dan kontra.
Opsi 1: Gunakan salah satu dari banyak perpustakaan yang tersedia
Pro
Cons
Opsi 2: Gunakan PhantomJs dan mungkin pustaka pembungkus
Pro
Cons
Opsi 3: Gunakan Chrome Headless dan mungkin perpustakaan pembungkus
Pro
Cons
Opsi 4: Gunakan API
Pro
Cons
Disclosure: Saya adalah pendiri ApiFlash. Saya melakukan yang terbaik untuk memberikan jawaban yang jujur dan bermanfaat.
sumber
Semua jawaban di sini menggunakan perpustakaan pihak ketiga saat merender HTML ke gambar bisa relatif sederhana dalam Javascript murni. Ada
yangbahkan sebuah artikel tentang hal itu pada bagian kanvas di MDN.Kuncinya adalah ini:
drawImage
ke atas kanvasBeberapa hal yang perlu diperhatikan
sumber
Document
untuk dirender menjadi raster (misalnya aCanvas
), tetapi karena tidak ada yang peduli untuk membakukannya, kita harus menggunakan kegilaan seperti diilustrasikan di atas (jangan tersinggung oleh penulis ini) kode).Anda bisa menggunakan PhantomJS , yang merupakan webkit tanpa kepala (mesin rendering di safari dan (hingga baru-baru ini) driver chrome). Anda dapat mempelajari cara melakukan tangkapan layar halaman di sini . Semoga itu bisa membantu!
sumber
Anda dapat menggunakan alat HTML ke PDF seperti wkhtmltopdf. Dan kemudian Anda dapat menggunakan alat PDF untuk gambar seperti imagemagick. Memang ini adalah sisi server dan proses yang sangat berbelit-belit ...
sumber
Node.js
. Bagaimana dengan frontend sederhana?Satu-satunya perpustakaan yang saya gunakan untuk Chrome, Firefox, dan MS Edge adalah rasterizeHTML . Ini menghasilkan kualitas yang lebih baik daripada HTML2Canvas dan masih didukung tidak seperti HTML2Canvas.
Mendapatkan Elemen dan Mengunduh sebagai PNG
sumber
rasterizeHTML.drawHTML(node.innerHTML, canvas)
Perhatikan bahwa saya memanggil innerHTML pada nodeGunakan html2canvas cukup sertakan plugin dan metode panggilan untuk mengkonversi HTML ke Canvas kemudian unduh sebagai PNG gambar
Sumber : http://www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
sumber
Saya tidak berharap ini menjadi jawaban terbaik, tetapi sepertinya cukup menarik untuk dikirim.
Tulis aplikasi yang membuka browser favorit Anda ke dokumen HTML yang diinginkan, ukuran jendela dengan benar, dan mengambil screenshot. Kemudian, hapus batas gambar.
sumber
Gunakan kode ini, pasti akan bekerja:
Hanya saja, jangan lupa untuk memasukkan file Html2CanvasJS dalam program Anda. https://html2canvas.hertzen.com/dist/html2canvas.js
sumber
Anda tidak dapat melakukan ini 100% akurat hanya dengan JavaScript.
Ada alat Qt Webkit di luar sana, dan versi python . Jika Anda ingin melakukannya sendiri, saya sudah sukses dengan Cocoa:
Semoga ini membantu!
sumber
Instal phantomjs
Buat file github.js dengan kode berikut
Berikan file sebagai argumen ke phantomjs
sumber
HtmlToImage.jar akan menjadi cara paling sederhana untuk mengubah html menjadi gambar
Konversi HTML ke gambar menggunakan java
sumber
Anda dapat menambahkan referensi HtmlRenderer ke proyek Anda dan melakukan hal berikut,
sumber