Przechwycić HTML Canvas jako gif / jpg/png / pdf?
Czy możliwe jest przechwytywanie lub drukowanie tego, co jest wyświetlane w kanwie html jako obraz lub pdf?
Chciałbym wygenerować obraz za pomocą canvas i móc wygenerować png z tego obrazu.
10 answers
UPS. Oryginalna odpowiedź była specyficzna dla podobnego pytania. Poprawiono:
var canvas = document.getElementById("mycanvas");
var img = canvas.toDataURL("image/png");
Z wartością w IMG możesz to zapisać jako nowy obrazek w ten sposób:
document.write('<img src="'+img+'"/>');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 22:45:58
HTML5 udostępnia Canvas.toDataURL (mimetype), który jest zaimplementowany w Opera, Firefox i Safari 4 beta. Istnieje jednak wiele ograniczeń bezpieczeństwa(głównie związanych z rysowaniem zawartości z innego źródła na kanwie).
Więc nie potrzebujesz dodatkowej biblioteki.
Np.
<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>
Teoretycznie powinno to utworzyć, a następnie przejść do obrazu z Zielonym kwadratem w środku, ale nie testowałem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 01:48:01
Pomyślałem, że poszerzę zakres tego pytania o kilka przydatnych ciekawostek na ten temat.
Aby uzyskać płótno jako obraz, należy wykonać następujące czynności:
var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png");
Możesz użyć tego, aby zapisać obraz na stronie:
document.write('<img src="'+image+'"/>');
Gdzie "image / png" jest typem mime (png jest jedynym, który musi być obsługiwany). Jeśli chcesz mieć tablicę obsługiwanych typów, możesz zrobić coś w następujący sposób:
var imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/tiff']; //Extend as necessary
var acceptedMimes = new Array();
for(i = 0; i < imageMimes.length; i++) {
if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0) {
acceptedMimes[acceptedMimes.length] = imageMimes[i];
}
}
Wystarczy uruchomić to tylko raz na strona-nigdy nie powinna się zmieniać w trakcie cyklu życia strony.
Jeśli chcesz, aby użytkownik pobrał plik tak, jak jest zapisany, możesz wykonać następujące czynności:
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;
Jeśli używasz tego z różnymi typami mime, pamiętaj, aby zmienić obie instancje image / png, ale nie image / octet-stream. Warto również wspomnieć, że jeśli używasz zasobów między domenami w renderowaniu płótna, napotkasz błąd bezpieczeństwa podczas próby użycia metody toDataUrl.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 14:52:10
function exportCanvasAsPNG(id, fileName) {
var canvasElement = document.getElementById(id);
var MIME_TYPE = "image/png";
var imgURL = canvasElement.toDataURL(MIME_TYPE);
var dlLink = document.createElement('a');
dlLink.download = fileName;
dlLink.href = imgURL;
dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
document.body.appendChild(dlLink);
dlLink.click();
document.body.removeChild(dlLink);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 10:45:04
Użyłbym "wkhtmltopdf ". Po prostu działa świetnie. Wykorzystuje silnik webkit (używany w Chrome, Safari itp.), i jest bardzo łatwy w użyciu:
wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
To jest to!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 03:24:18
Oto pomoc, jeśli wykonasz pobieranie przez serwer (w ten sposób możesz nazwać/przekonwertować/Post-proces / etc Twój plik):
- Post data using toDataURL
- Ustaw nagłówki
$filename = "test.jpg"; //or png
header('Content-Description: File Transfer');
if($msie = !strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false)
header("Content-type: application/force-download");else
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Expires: 0"); header("Cache-Control: must-revalidate");
header("Pragma: public");
-Utwórz obraz
$data = $_POST['data'];
$img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));
- Eksportuj obraz jako JPEG
$width = imagesx($img);
$height = imagesy($img);
$output = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($output, 255, 255, 255);
imagefilledrectangle($output, 0, 0, $width, $height, $white);
imagecopy($output, $img, 0, 0, 0, 0, $width, $height);
imagejpeg($output);
exit();
imagesavealpha($img, true);
imagepng($img);
die($img);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:08
Innym ciekawym rozwiązaniem jest PhantomJS . Jest to Bezgłowy WebKit do skryptów JavaScript lub CoffeeScript.
Jednym z przypadków użycia jest przechwytywanie ekranu : można programowo przechwytywać zawartość sieci Web, w tym SVG i Canvas i / lub tworzyć zrzuty ekranu witryny internetowej z podglądem miniatur.
Najlepszym punktem wejścia jest strona wiki screen capture .
Oto dobry przykład zegara polarnego (od RaphaelJS):>phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png
Czy chcesz renderować strona do pliku PDF ?
> phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-21 11:28:05
Jeśli używasz jQuery, co robi sporo ludzi, to zaimplementujesz akceptowaną odpowiedź w ten sposób:
var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 01:31:48
Możesz użyć jspdf do przechwytywania płótna do obrazu lub pdf w następujący sposób:
var imgData = canvas.toDataURL('image/png');
var doc = new jsPDF('p', 'mm');
doc.addImage(imgData, 'PNG', 10, 10);
doc.save('sample-file.pdf');
Więcej informacji: https://github.com/MrRio/jsPDF
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-13 21:27:32
W niektórych wersjach Chrome można:
- Użyj funkcji rysuj obraz
ctx.drawImage(image1, 0, 0, w, h);
- Kliknij prawym przyciskiem myszy na Płótnie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-16 22:13:30