HTML5 Canvas到PNG文件

Tes*_*est 47 javascript html5 canvas

我正在尝试将HTML5画布转换为图像.这是我到目前为止所得到的:

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

但问题是我得到这个代码:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAgAElEQVR4nNS6Z1xVaZbvv/c+CVOZc6mYEMlJMZRizgljGRARs6AgOSMGQATBSM5ZyTkoOQkSzJWrp3t6etLt6Z7pmf/c++L7f3EOiBZW2dM9dz73xfdzztl7n3Oe/Txrrd9a69mCTC4gkwvIZAKSTECUBARRQBA+jii+46f.......class="image">
Run Code Online (Sandbox Code Playgroud)

我想要一个用户可以下载的普通图像路径!

有帮助吗?

Nip*_*pey 85

信息: IE10 +根本不支持以下方法.其他人已经完成了工作并实施了跨浏览器解决方案. 是其中之一.

首先,将生成的数据URL添加到标记的href属性中<a>.但是在某些浏览器上,仅此一项不会触发下载.相反,它将在新页面中打开链接的图像.

下载base64图像的对话框:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...." class="image" />
Run Code Online (Sandbox Code Playgroud)

基于上面的示例,将数据URL的MIME类型转换为:

<a href="data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg....">Download</a>
Run Code Online (Sandbox Code Playgroud)

通过告诉浏览器数据application/octet-stream,它会要求您将其保存在硬盘上.


指定文件名:

正如Adi在下面的评论中所说,没有标准的方法来使用这种方法定义文件名.但是,有两种方法可能适用于某些浏览器.

A)downloadGoogle Crome引入的属性

<a download="image.png" href="...">
Run Code Online (Sandbox Code Playgroud)

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">
Run Code Online (Sandbox Code Playgroud)

这至少在Opera的一些旧版本中起作用. 以下是对此的一些讨论.

查看主要浏览器的Bug/Feature-Tracking系统表明,定义文件名是社区的一大愿望.也许我们将在不久的将来看到跨浏览器兼容的解决方案!;)


保存RAM和CPU资源:

如果您不想膨胀访问者浏览器的RAM,您还可以动态生成数据URL:

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

这样,浏览器仍然可以将画布显示为图像文件.如果您想增加打开下载对话框的可能性,您应该扩展上面的功能,以便它进行替换,如上所示:

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

最后,添加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);
Run Code Online (Sandbox Code Playgroud)
<canvas id="cnv" width="32" height="32"></canvas>
<a id="dl" download="Canvas.png" href="#">Download Canvas</a>
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是,您不能以这种方式指定文件名. (4认同)

gil*_*lyb 6

您可以使用reimg库将画布转换为图像对象,甚至可以为用户触发下载.

在页面中插入库后,只需使用: ReImg.fromCanvas(yourCanvasElement).downloadPng()


Adi*_*Adi 5

您有2个选项(几乎适用于所有浏览器):

1- 将数据发布到服务器:
在服务器上,您将拥有一个处理数据的脚本,然后告诉浏览器提示用户下载.

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

2- 使用 Downloadify 提示用户下载

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

Downloadify.create( 'clickMe', {
   data: base64String,
   dataType: 'base64',
   filename: 'something.png'
});
Run Code Online (Sandbox Code Playgroud)