web-dev-qa-db-ja.com

HTML Canvasをgif/jpg/png/pdfとしてキャプチャしますか?

HTMLキャンバスに表示されているものを画像またはpdfとしてキャプチャまたは印刷することはできますか?

キャンバスを介して画像を生成し、その画像からPNGを生成できるようにしたいです。

651
Parand

おっとっと。元の答えは、同様の質問に固有のものでした。これは改訂されました:

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

iMGの値を使えば、新しいImageとして書き出すことができます。

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

HTML5はCanvas.toDataURL(mimetype)を提供します。これはOpera、Firefox、そしてSafari 4ベータで実装されています。ただし、セキュリティ上の制限がいくつかあります(ほとんどの場合、他のOriginからキャンバスにコンテンツを描画する場合)。

追加のライブラリは必要ありません。

例えば.

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

理論的には、これで画像が作成され、その中央に緑色の四角形がある画像に移動するはずですが、テストはしていません。

111
olliej

私はこの問題の範囲を少し広げて、この問題についての役に立つヒントをいくつか考えてみたいと思いました。

キャンバスをイメージとして取得するには、次の手順に従います。

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メソッドを使用しようとしたときにセキュリティエラーが発生することにも注意してください。

41
meiamsome
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);
}
30

私は " wkhtmltopdf "を使うでしょう。それだけでうまくいきます。これはウェブキットエンジン(Chrome、Safariなどで使用されています)を使用しています、そしてそれは非常に使いやすいです:

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

それでおしまい!

それを試してみてください

21
lepe

あなたがサーバを通してダウンロードをするなら、ここにいくらかの助けがあります(このようにあなたはあなたのファイルに/ convert/post-process/etcを命名することができます):

toDataURLを使用したデータの投稿

- ヘッダを設定する

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

-export 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();

- または 透明PNGとして

imagesavealpha($img, true);
imagepng($img);
die($img);
14
user669677

もう一つの興味深い解決策は PhantomJS です。これは、JavaScriptまたはCoffeeScriptでスクリプト可能なヘッドレスWebKitです。

ユースケースの1つはスクリーンキャプチャです。SVGやCanvasなどのWebコンテンツをプログラムでキャプチャしたり、サムネイルプレビュー付きのWebサイトスクリーンショットを作成したりできます。

最良のエントリポイントは スクリーンキャプチャ wikiページです。

これは、(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
8
Cybermaxs

あなたがjQueryを使っているのであれば、かなり多くの人がそうしているでしょう、そしてあなたはそのように受け入れられた答えを実装するでしょう:

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

$("#elememt-to-write-to").html('<img src="'+img+'"/>');
3
Pattle

キャンバスを画像またはpdfにキャプチャするには、jspdfを使用します。

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

1
ferralucho