当前位置: 首页 > 面试题库 >

HTML5画布到PNG文件

穆锋
2023-03-14
问题内容

我正在尝试将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">

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

有什么帮助吗?


问题答案:

信息: IE10 +完全不支持以下方法。其他人已经完成了工作并实现了跨浏览器解决方案。
这就是其中之一。

首先,将生成的数据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,它将要求您将数据保存在硬盘上。

指定文件名:

A)downloadGoogle Crome引入的属性

<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版本中有效。
这里是一些讨论。

对主要浏览器的Bug /功能跟踪系统的研究表明,定义文件名是社区的一个很大愿望。也许我们会在不久的将来看到跨浏览器兼容的解决方案!;)

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


 类似资料:
  • 问题内容: 我想将以Base64编码的PNG图像加载到canvas元素。我有以下代码: 在Chrome 8中,我收到错误消息: 在Firefox的Firebug中,这是:“对象的类型与与该对象关联的参数的预期类型不兼容”代码:“ 17” 在那个base64中,是我在GIMP中制作的5x5px黑色PNG正方形,并将其转换为GNU / Linux程序base64中的base64。 问题答案: 从外观上

  • 本文向大家介绍HTML5画布转换,包括了HTML5画布转换的使用技巧和注意事项,需要的朋友参考一下 HTML5 canvas提供了允许直接修改转换矩阵的方法。转换矩阵最初必须是身份转换。然后可以使用转换方法对其进行调整。 示例 让我们看一个画布转换的例子:

  • 问题内容: 是否有将SVG文件绘制到HTML5画布上的默认方法?GoogleChrome支持将SVG加载为图像(并简单地使用),但是开发者控制台会对此进行警告。 我知道将SVG转换为canvas命令的可能性,但是我希望这不是必需的。我不在乎较旧的浏览器(因此,如果FireFox 4和IE 9支持某些功能,那就足够了)。 问题答案: 编辑2019年12月16日 现在所有主要浏览器都支持Path2D

  • https://developer.mozilla.org/en/Canvas_tutorial/Transformations http://en.wikipedia.org/wiki/Spirograph 移植一个HTML5画布图像到QML画布非常简单。在成百上千的例子中,我们选择了一个来移植。 螺旋图形(Spiro Graph) 我们使用一个来自Mozila项目的螺旋图形例子来作为我们的基础

  • 问题内容: 没有任何扩展库,同一个canvas元素中可以有多个图层吗? 因此,如果我在顶层上执行clearRect,它将不会擦除底层? 谢谢。 问题答案: 不,但是,您可以将多个元素彼此叠加并完成类似的操作。 在画布上绘制第一层,在画布上绘制第二层。然后,当您在顶层时,下部画布上的所有内容都会显示出来。

  • 问题内容: 即时创建元素并能够移动元素的最佳方法是什么?例如,假设我要创建一个矩形,圆形和多边形,然后选择这些对象并四处移动。 我了解HTML5提供了三个使之成为可能的元素:svg,canvas和div。对于我想做什么,这些元素中的哪一个将提供最佳性能? 为了比较这些方法,我正在考虑创建三个视觉上相同的网页,每个网页中都有页眉,页脚,小部件和文本内容。第一页中的小部件将完全使用元素创建,第二页中的