首页 文章

将HTML Canvas捕获为gif / jpg / png / pdf?

提问于
浏览
629

是否可以捕获或打印html画布中显示的图像或pdf?

我想通过画布生成图像,并能够从该图像生成一个png .

10 回答

  • 14

    哎呀 . 原始答案是针对类似问题的 . 这已被修改:

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

    使用IMG中的值,您可以将其写为新图像,如下所示:

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

    HTML5提供了Canvas.toDataURL(mimetype),它在Opera,Firefox和Safari 4 beta中实现 . 但是,存在许多安全限制(主要与将另一个来源的内容绘制到画布上有关) .

    所以你不需要额外的库 .

    例如

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

    从理论上讲,这应该创建然后导航到中间带有绿色方块的图像,但我还没有测试过 .

  • 28

    我想我会扩大这个问题的范围,在这个问题上有一些有用的花絮 .

    要将画布作为图像,您应该执行以下操作:

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

    您可以使用它将图像写入页面:

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

    其中“image / png”是mime类型(png是唯一必须支持的类型) . 如果您想要一组受支持的类型,您可以按照以下方式执行某些操作:

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

    您只需要每页运行一次 - 它永远不会改变页面的生命周期 .

    如果您希望让用户在保存文件时下载该文件,您可以执行以下操作:

    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;
    

    如果您使用不同的mime类型,请务必更改image / png的两个实例,而不是image / octet-stream . 还值得一提的是,如果在渲染画布时使用任何跨域资源,则在尝试使用toDataUrl方法时将遇到安全性错误 .

  • 8
    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);
    }
    
  • 1

    我会用“wkhtmltopdf” . 它工作得很好 . 它使用webkit引擎(用于Chrome,Safari等),它非常易于使用:

    wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
    

    而已!

    Try it

  • 656

    如果您通过服务器下载(这样您可以命名/转换/后处理/等等您的文件),这里有一些帮助:

    • 使用 toDataURL 的数据

    • 设置 Headers

    $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");
    
    • 创建图像
    $data = $_POST['data'];
    $img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));
    
    $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);
    
  • -1

    另一个有趣的解决方案是PhantomJS . 这是一个使用JavaScript或CoffeeScript的无头WebKit脚本 .

    其中一个用例是屏幕截图:您可以通过编程方式捕获Web内容,包括SVG和Canvas和/或使用缩略图预览创建网站屏幕截图 .

    最佳切入点是screen capture维基页面 .

    这是极地时钟的一个很好的例子(来自RaphaelJS):

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

    您要将页面呈现为PDF吗?

    > phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
    
  • 107

    如果您正在使用jQuery,这是很多人所做的,那么您将实现接受的答案,如下所示:

    var canvas = $("#mycanvas")[0];
    var img = canvas.toDataURL("image/png");
    
    $("#elememt-to-write-to").html('<img src="'+img+'"/>');
    
  • 21

    您可以使用jspdf将画布捕获到图像或pdf中,如下所示:

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

    更多信息:https://github.com/MrRio/jsPDF

  • 3

    在某些版本的Chrome上,您可以:

    • 使用绘制图像功能 ctx.drawImage(image1, 0, 0, w, h);

    • 右键单击画布

相关问题