Capture HTML Canvas as gif/jpg/png / pdf?

est-il possible de capturer ou d'imprimer ce qui est affiché dans une toile html sous forme d'image ou de pdf?

j'aimerais générer une image via canvas, et pouvoir générer un png à partir de cette image.

620
demandé sur ZJR 2009-05-29 04:28:27

10 réponses

Oops. La réponse originale était spécifique à une question similaire. Ceci a été révisé:

var canvas = document.getElementById("mycanvas");
var img    = canvas.toDataURL("image/png");

avec la valeur en IMG vous pouvez l'écrire comme une nouvelle Image comme ceci:

document.write('<img src="'+img+'"/>');
647
répondu donohoe 2011-07-17 22:45:58

HTML5 fournit la Toile.toDataURL (mimetype) qui est implémenté dans Opera, Firefox et Safari 4 beta. Il y a cependant un certain nombre de restrictions de sécurité (principalement en ce qui concerne le dessin du contenu d'une autre origine sur la toile).

donc vous n'avez pas besoin d'une bibliothèque supplémentaire.

p.ex.

 <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>

théoriquement cela devrait créer et puis naviguer à une image avec un carré vert au milieu de celui-ci, mais je ne l'ai pas testé.

106
répondu olliej 2016-04-09 01:48:01

j'ai pensé étendre un peu la portée de cette question, avec quelques informations utiles sur la question.

pour obtenir la toile comme une image, vous devez faire ce qui suit:

var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png");

vous pouvez utiliser ceci pour écrire l'image à la page:

document.write('<img src="'+image+'"/>');

où "image / png" est un type mime (png est le seul qui doit être supporté). Si vous voulez un tableau des types supportés, Vous pouvez faire quelque chose le long du des lignes de:

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];
    }
}

vous n'avez besoin de l'exécuter qu'une fois par page - il ne doit jamais changer à travers le cycle de vie d'une page.

si vous souhaitez que l'utilisateur télécharge le fichier tel qu'il est sauvegardé, vous pouvez faire ce qui suit:

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;

si vous utilisez cela avec différents types mime, assurez-vous de changer les deux instances d'image/png, mais pas l'image/octet-stream. Il est également intéressant de mentionner que si vous utilisez un ressources dans le rendu de votre toile, vous rencontrerez une erreur de sécurité lorsque vous tenterez d'utiliser la méthode toDataUrl.

35
répondu meiamsome 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);
}
28
répondu david.barkhuizen 2015-06-04 10:45:04

je voudrais utiliser " wkhtmltopdf ". Il vient de l'excellent travail. Il utilise le moteur webkit (utilisé dans Chrome, Safari, etc.), et il est très facile à utiliser:

     wkhtmltopdf /q/capture-html-toile-comme-gif-jpg-png-pdf-62117/"http://wkhtmltopdf.org/" rel="noreferrer">    

21
répondu lepe 2016-04-09 03:24:18

voici de l'aide si vous téléchargez via un serveur (de cette façon vous pouvez nommer/convertir/post-process/etc votre fichier):

Post données à l'aide de toDataURL

- placer les en-têtes

$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");

- créer l'image

$data = $_POST['data'];
$img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));

-exportation d'une image 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();

- ou en tant que PNG transparent

imagesavealpha($img, true);
imagepng($img);
die($img);
13
répondu Community 2017-05-23 12:10:08

une autre solution intéressante est PhantomJS . C'est un WebKit sans tête scriptable avec JavaScript ou CoffeeScript.

l'un des cas d'utilisation est la capture d'écran : vous pouvez capturer programmatiquement des contenus web, y compris SVG et Canvas et/ou créer des captures d'écran de site web avec prévisualisation miniature.

le meilleur point d'entrée est la page wiki capture d'écran .

voici un bon exemple pour l'horloge polaire (de RaphaelJS):

>phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png

voulez-vous rendre une page en PDF ?

> phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
8
répondu Cybermaxs 2013-05-21 11:28:05

si vous utilisez jQuery, ce que beaucoup de gens font, alors vous mettriez en œuvre la réponse acceptée comme ceci:

var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");

$("#elememt-to-write-to").html('<img src="'+img+'"/>');
3
répondu Pattle 2016-04-09 01:31:48

vous pouvez utiliser jspdf pour capturer une toile dans une image ou pdf comme ceci:

var imgData = canvas.toDataURL('image/png');              
var doc = new jsPDF('p', 'mm');
doc.addImage(imgData, 'PNG', 10, 10);
doc.save('sample-file.pdf');

plus d'informations: https://github.com/MrRio/jsPDF

1
répondu ferralucho 2017-12-13 21:27:32

sur certaines versions de Chrome, vous pouvez:

  1. utilisez la fonction d'image de tirage ctx.drawImage(image1, 0, 0, w, h); 151950920"
  2. faites un clic droit sur la toile
-1
répondu Peter 2015-11-16 22:13:30