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


719

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

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


:ここではニシキヘビソリューションですstackoverflow.com/questions/19395649/...は、回答に加えてstackoverflow.com/a/3514404/529442
ユージンのGr。フィリポフ2016年



1
canvas2imageライブラリはこれに役立ちます:github.com/hongru/canvas2image
noego

回答:


737

おっとっと。元の回答は同様の質問に固有のものでした。これは修正されました:

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

IMGの値を使用して、次のように新しい画像として書き出すことができます。

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

15
もう1つの質問です。このタグで取得した画像をサーバーに保存するにはどうすればよいですか。何か推測?
スーリヤ、

7
ただし、var img = canvas.toDataURL( "image / jpeg");を使用する場合 背景を完全な黒として取得しています。それを修正する方法
gauti

181
あら。私は2009年にこれに答えました。何を期待していますか?
donohoe 2014年

35
@donohoeは実際には2010年8月に回答しました:)
ニック

13
それはのようなことをするためにはるかに少ないメモリを使用しますvar img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);document.writeコードは、彼らがその後、DOMでその文字列のコピーを入れて、HTML文字列を作り、データのURLを作っている、ブラウザは、その後、画像要素の上に別のコピーを入れて、そのHTML文字列を解析回すために再びそれを解析する必要があります画像データへのデータURL、そして最後に画像を表示できます。大量のメモリ/コピー/解析である画面サイズの画像の場合。ただの提案
gman

116

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

したがって、追加のライブラリは必要ありません。

例えば

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

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


2
画像が保存される場所。私の地元の場所?
chinna_82 2013

5
画像はブラウザに画像として表示されます。その後、それをディスクなどに保存できます。ここでは、新しいウィンドウでブラウザにPNGやディスプレイへのページの最初のキャンバスにそれを変換し、迅速かつ汚い一般的な「Canvas2PNG」ブックマークレットです:javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
甲斐カーバー

画像のサイズが数MBの場合は、ブラウザーをクラッシュさせる準備をします(FireFoxでしばらく前にそれを実行しました)。
2015年

1
これを変更して複数の画像をレンダリングするにはどうすればよいですか?
メンタリスト

データURIには最大長があるため、データURLに配置できる画像のサイズには上限があります。
JuhaSyrjälä2018年

44

私はこの問題の範囲を少し広げて、問題についていくつか役立つ情報を添えたいと思いました。

キャンバスを画像として取得するには、以下を実行する必要があります。

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

これはページごとに1回だけ実行する必要があります。ページのライフサイクルを通じて変更されることはありません。

保存時にファイルをユーザーにダウンロードさせる場合は、次の操作を実行できます。

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メソッドを使用しようとするとセキュリティエラーが発生することにも言及する価値があります。


1
ファイルをダウンロードするための解決策では、使用したいソフトウェアを選択する必要があります。少し不便です...ダウンロードしたMIMEをpngに置き換える方法はありますか?
So4ne 2013

1
@ So4ne私はそうは思いません、それはユーザーにダウンロードを促すための画像/オクテットストリームでなければなりません。その行を取り除くと、ページは画像にリダイレクトされます。他の誰かがこれをうまく行う方法を知っているかどうか知りたいです。
meiamsome

2
<a>リンクと.click()でtarget = "_ blank"を使用すると、ダウンロードもトリガーできます(text / csvおよびtext / plainのFF data-urlsおよびdownload = "filename"でテスト)
Ax3l

これは素晴らしい。ありがとう!しかし、ローカルではなくサーバーに保存したい場合はどうなりますか?フォームファイルの入力は、img srcをアップロード可能なものとして受け入れますか?
チーフアルケミスト2015年

おっとっと。ちょうど答えを見つけました。他の誰かがうまくとして見た場合の前の質問残すstackoverflow.com/questions/13198131/...
チーフ錬金術

34
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);
}

保存されたファイルは.svg形式のままです。pngとして保存する方法は?
nullpointer 2016

これはIEで機能しない可能性があることを除いて、優れたソリューションです。エラー「システムコールに渡されたデータ領域が小さすぎます」
Jose Cherian '10 / 07/17

Chromeでは「ネットワークエラー」と表示されますが、Firefoxではうまく機能します。(Linuxの場合)
Ecker00 2018年

20

wkhtmltopdf」を使用します。それだけでうまくいきます。Webkitエンジン(Chrome、Safariなどで使用)を使用しており、非常に使いやすいです。

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

それでおしまい!

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


1
私もwkhtmltopdfキャンプにいます。私たちはそれをアーカイブとその驚くべきことに使用してきました。
Daniel Szabo

ログイン情報が必要なページでWKHTMLtoPDFを使用する方法 私は、PDFに変換するJsreportを使用していますが、私はHTML2Canvasと私のコンテンツをキャプチャ、私はJSreportにパラメータとしてキャンバスを送信することに問題がある
ハレドDehia

チェック@khaledDehia:stackoverflow.com/questions/10287386/...
レペ

15

サーバー経由でダウンロードする場合のヘルプをいくつか示します(このようにして、ファイルに名前を付けたり、変換したり、後処理したりすることができます)。

-投稿データ 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)));

-画像を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);

9

別の興味深い解決策は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

2
+1:PhantomJSはシンプルで、十分に文書化され、よく考えられたシステムであり、この仕事に最適です。キャンバスをつかむだけでなく、たとえば、ページまたはその一部を(JSを介して)変更してから、好きなように見せることができます。パーフェクト!
johndodo 2013

1
PhantomJs廃止されました
傭兵

3

多くの人が行うjQueryを使用している場合は、次のように承認された回答を実装します。

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

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

12
ここでのjQuery の唯一の使用法は、キャンバスの選択であることに注意してください。.toDataURLネイティブJSです。
j6m8 14

:私はいくつかのいずれかが、私はこのリンクを見るのを助けることができ、問題のセーブ持っstackoverflow.com/questions/25131763/...
ラメシュS

2
純粋な(100%)jQueryソリューションは次のとおりです。$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());正確に1行。
Naeel Maqsudov 2015年

1

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


1

これはもう1つの方法です。文字列がない場合は、高速かどうかはわかりません。toDataURLの代わりに(ここでのすべての質問が提案するとおり)。私の場合、配列のバッファーまたはビューが必要なので、dataUrl / base64を防ぎます。したがって、HTMLCanvasElementの他のメソッドはtoBlobです。(TypeScript関数):

    export function canvasToArrayBuffer(canvas: HTMLCanvasElement, mime: string): Promise<ArrayBuffer> {
  return new Promise((resolve, reject) => canvas.toBlob(async (d) => {
    if (d) {
      const r = new FileReader();
      r.addEventListener('loadend', e => {
        const ab = r.result;
        if (ab) {
          resolve(ab as ArrayBuffer);
        }
        else {
           reject(new Error('Expected FileReader result'));
        }
      }); r.addEventListener('error', e => {
        reject(e)
      });
      r.readAsArrayBuffer(d);
    }
    else {
      reject(new Error('Expected toBlob() to be defined'));
    }
  }, mime));
}

blobのもう1つの利点は、HTMLInputFileの 'files'メンバーと同様に、データをファイルとして表すObjectUrlを作成できることです。より詳しい情報:

https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob


-1

Chromeの一部のバージョンでは、次のことができます。

  1. 画像の描画機能を使用する ctx.drawImage(image1, 0, 0, w, h);
  2. キャンバスを右クリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.