HTMLキャンバスに表示されているものを画像またはPDFとしてキャプチャまたは印刷することはできますか?
キャンバスを介して画像を生成し、その画像からpngを生成できるようにしたいと考えています。
HTMLキャンバスに表示されているものを画像またはPDFとしてキャプチャまたは印刷することはできますか?
キャンバスを介して画像を生成し、その画像からpngを生成できるようにしたいと考えています。
回答:
おっとっと。元の回答は同様の質問に固有のものでした。これは修正されました:
var canvas = document.getElementById("mycanvas");
var img = canvas.toDataURL("image/png");
IMGの値を使用して、次のように新しい画像として書き出すことができます。
document.write('<img src="'+img+'"/>');
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
。document.write
コードは、彼らがその後、DOMでその文字列のコピーを入れて、HTML文字列を作り、データのURLを作っている、ブラウザは、その後、画像要素の上に別のコピーを入れて、そのHTML文字列を解析回すために再びそれを解析する必要があります画像データへのデータURL、そして最後に画像を表示できます。大量のメモリ/コピー/解析である画面サイズの画像の場合。ただの提案
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>
理論的には、これで作成され、中央に緑色の四角が表示された画像に移動しますが、テストしていません。
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
私はこの問題の範囲を少し広げて、問題についていくつか役立つ情報を添えたいと思いました。
キャンバスを画像として取得するには、以下を実行する必要があります。
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メソッドを使用しようとするとセキュリティエラーが発生することにも言及する価値があります。
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);
}
「wkhtmltopdf」を使用します。それだけでうまくいきます。Webkitエンジン(Chrome、Safariなどで使用)を使用しており、非常に使いやすいです。
wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
それでおしまい!
サーバー経由でダウンロードする場合のヘルプをいくつか示します(このようにして、ファイルに名前を付けたり、変換したり、後処理したりすることができます)。
-投稿データ 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)));
$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);
別の興味深い解決策は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
多くの人が行うjQueryを使用している場合は、次のように承認された回答を実装します。
var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
.toDataURL
ネイティブJSです。
$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
正確に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');
これはもう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