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.

Author: ZJR, 2009-05-29

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+'"/>');
 647
Author: donohoe,
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.

 106
Author: olliej,
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.

 35
Author: meiamsome,
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);
}
 28
Author: david.barkhuizen,
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!

Try it

 21
Author: lepe,
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();

-lub jako przezroczysty PNG

imagesavealpha($img, true);
imagepng($img);
die($img);
 13
Author: Community,
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
 8
Author: Cybermaxs,
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+'"/>');
 3
Author: Pattle,
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

 1
Author: ferralucho,
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:

  1. Użyj funkcji rysuj obraz ctx.drawImage(image1, 0, 0, w, h);
  2. Kliknij prawym przyciskiem myszy na Płótnie
 -1
Author: Peter,
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