57

HTML5 キャンバスを画像に変換しようとしています。これは私がこれまでに得たものです:

var tmp_canvas = document.getElementById('canvas');
var dataURL = tmp_canvas.toDataURL("image/png");
$('#thumbnail_list').append($('<img/>', { src : dataURL }).addClass('image'));

しかし問題は、私がこのコードを取得することです:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAgAElEQVR4nNS6Z1xVaZbvv/c+CVOZc6mYEMlJMZRizgljGRARs6AgOSMGQATBSM5ZyTkoOQkSzJWrp3t6etLt6Z7pmf/c++L7f3EOiBZW2dM9dz73xfdzztl7n3Oe/Txrrd9a69mCTC4gkwvIZAKSTECUBARRQBA+jii+46f.......class="image">

ユーザーがダウンロードできる通常のイメージ パスが必要です。

何か助けはありますか?

4

4 に答える 4

92

情報: IE10+ は以下の方法をまったくサポートしていません。他の人は既に作業を行い、クロスブラウザー ソリューションを実装しています。 これはそれらの1つです。

まず、生成されたデータ URL をタグのhref属性に追加します。<a>ただし、一部のブラウザでは、これだけではダウンロードがトリガーされません。代わりに、リンクされた画像を新しいページで開きます。

base64 イメージのダウンロード ダイアログ:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...." class="image" />

上記の例に基づいて、データ URL の MIME タイプを次のように変換します。

<a href="data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg....">Download</a>

ブラウザにデータが であることを伝えると、application/octet-streamハードディスクに保存するように求められます。


ファイル名の指定:

以下のコメントでAdiが述べたように、この方法を使用してファイル名を定義する標準的な方法はありません。ただし、一部のブラウザでは機能する可能性のある 2 つのアプローチがあります。

A) downloadGoogle Chrome によって導入された属性

<a download="image.png" href="...">

B) データ URL 内の HTTP ヘッダーの定義
headers=Content-Disposition: attachment; filename=image.png

<a href="data:application/octet-stream;headers=Content-Disposition%3A%20attachment%3B%20filename=image.png;base64,iVBORw0KGgoAAAA">

これは、少なくとも一部の古いバージョンの Opera では機能しました。 これについての議論があります

主要なブラウザーのバグ/機能追跡システムを調べると、ファイル名を定義することはコミュニティの大きな願いであることがわかります。近い将来、クロスブラウザ対応のソリューションが登場するかもしれません! ;)


RAM と CPU リソースを保存します。

訪問者のブラウザーの RAM を肥大化させたくない場合は、データ URL を動的に生成することもできます。

<a id="dl" download="Canvas.png">Download Canvas</a>
function dlCanvas() {
    var dt = canvas.toDataURL('image/png');
    this.href = dt;
};
dl.addEventListener('click', dlCanvas, false);

このように、キャンバスは引き続きブラウザーで画像ファイルとして表示される場合があります。ダウンロード ダイアログを開く確率を高めたい場合は、上記の関数を拡張して、上記のように置換を行う必要があります。

function dlCanvas() {
    var dt = canvas.toDataURL('image/png');
    this.href = dt.replace(/^data:image\/[^;]/, 'data:application/octet-stream');
};
dl.addEventListener('click', dlCanvas, false);

最後に、HTTP ヘッダーを追加して、ほとんどのブラウザが有効なファイル名を提供することをさらに確認してください! ;)


完全な例:
var canvas = document.getElementById("cnv");
var ctx = canvas.getContext("2d");

/* FILL CANVAS WITH IMAGE DATA */
function r(ctx, x, y, w, h, c) {
  ctx.beginPath();
  ctx.rect(x, y, w, h);
  ctx.strokeStyle = c;
  ctx.stroke();
}
r(ctx, 0, 0, 32, 32, "black");
r(ctx, 4, 4, 16, 16, "red");
r(ctx, 8, 8, 16, 16, "green");
r(ctx, 12, 12, 16, 16, "blue");

/* REGISTER DOWNLOAD HANDLER */
/* Only convert the canvas to Data URL when the user clicks. 
   This saves RAM and CPU ressources in case this feature is not required. */
function dlCanvas() {
  var dt = canvas.toDataURL('image/png');
  /* Change MIME type to trick the browser to downlaod the file instead of displaying it */
  dt = dt.replace(/^data:image\/[^;]*/, 'data:application/octet-stream');

  /* In addition to <a>'s "download" attribute, you can define HTTP-style headers */
  dt = dt.replace(/^data:application\/octet-stream/, 'data:application/octet-stream;headers=Content-Disposition%3A%20attachment%3B%20filename=Canvas.png');

  this.href = dt;
};
document.getElementById("dl").addEventListener('click', dlCanvas, false);
<canvas id="cnv" width="32" height="32"></canvas>
<a id="dl" download="Canvas.png" href="#">Download Canvas</a>

于 2012-10-09T09:20:53.303 に答える
12

reimgライブラリを使用して、キャンバスを画像オブジェクトに変換し、ユーザーのダウンロードをトリガーすることもできます。

ライブラリをページに挿入したら、次を使用します。 ReImg.fromCanvas(yourCanvasElement).downloadPng()

于 2015-09-01T15:36:14.070 に答える
5

2 つのオプションがあります (どちらもほぼすべてのブラウザーで動作します)。

1-データをサーバーに POST :
サーバーには、データを処理するスクリプトがあり、ブラウザにユーザーにダウンロードを促すように指示します。

header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=something.png");
header("Content-Type: image/png");
echo base64_decode($_POST['imageData']);
exit;

2- Downloadifyを使用してユーザーにダウンロードを促す

<div id="clickMe"></div>

Downloadify.create( 'clickMe', {
   data: base64String,
   dataType: 'base64',
   filename: 'something.png'
});
于 2012-10-09T09:27:03.247 に答える