gpt4 book ai didi

javascript - HTML5 Canvas toDataURL 在 for 循环中始终相同

转载 作者:行者123 更新时间:2023-12-02 14:50:39 26 4
gpt4 key购买 nike

考虑这个JSFiddle 。在其中,我选择照片,然后使用 Canvas 对其进行 Base64 编码,以便可以将它们存储在 sessionStorage 中以延迟上传。因为我为多个文件设置了它,所以我循环遍历每个文件并创建一个图像和一个 Canvas ,但无论如何它似乎每次都会输出完全相同的 Base64 编码图像。通过测试,我知道在每次循环迭代中图像都是不同的,并且确实指向不同的文件 blob,但 Canvas 只是一遍又一遍地输出相同的内容,我认为这也是文件列表中的最后一个文件。有时它也只会输出一个“数据”字符串,仅此而已。如果有人能指出我正确的方向,我会很高兴。

代码如下:

HTML

<style type="text/css">
input[type="file"] {
display: none;
}

a {
display: inline-block;
margin: 6px;
}
</style>
<form action="#" method="post">
<input type="file" accept="image/*" multiple />
<button type="button">Select Photos</button>
</form>
<nav></nav>

JavaScript

console.clear();

$(function () {
$("button[type=button]").on("click", function (e) {
$("input[type=file]").trigger("click");
});

$("input[type=file]").on("change", function (e) {
var nav = $("nav").empty();

for (var i = 0, l = this.files.length; i < l; i++) {
var file = this.files[i],
image = new Image();

$(image).on("load", i, function (e) {
var canvas = document.createElement("canvas"),
context = canvas.getContext("2d");

canvas.height = this.height;
canvas.width = this.width;

context.drawImage(this, 0, 0);

nav.append("<a href=\"" + canvas.toDataURL("image/jpeg") + "\" target=\"_blank\">" + e.data + "</a>");

URL.revokeObjectURL(this.src);
});

image.src = URL.createObjectURL(file);
}
});
});

最佳答案

but no matter what it just seems to output the exact same base64 encoded image every time.

.load() 事件是异步的。您可以使用 $.when()$.Deferred() ,将 $.map() 替换为 for > 循环处理异步加载的 img 元素。需要注意的是,显示的 a 元素文本可能不按数字顺序排列;可以通过对 .then() 处的元素进行排序来调整;尽管问题中没有解决,但如果需要,也可以实现图像的顺序列出或加载。

$("input[type=file]").on("change", function(e) {
var nav = $("nav").empty();
var file = this.files
$.when.apply($, $.map(file, function(img, i) {
return new $.Deferred(function(dfd) {
var image = new Image();
$(image).on("load", i, function(e) {
var canvas = document.createElement("canvas")
, context = canvas.getContext("2d");
canvas.height = this.height;
canvas.width = this.width;
context.drawImage(this, 0, 0);
nav.append("<a href=\""
+ canvas.toDataURL()
+ "\" target=\"_blank\">"
+ e.data + "</a>");
dfd.resolve()
URL.revokeObjectURL(this.src);
});
image.src = URL.createObjectURL(img);
return dfd.promise()
})
})).then(function() {
nav.find("a").each(function() {
console.log(this.href + "\n");
})
})
});
})

jsfiddle https://jsfiddle.net/bc6x3s02/19/

关于javascript - HTML5 Canvas toDataURL 在 for 循环中始终相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36212533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com