【发布时间】:2016-07-12 18:32:06
【问题描述】:
考虑一下JSFiddle。在其中我选择照片,然后我想使用画布对其进行 base64 编码,以便我可以将它们存储在sessionStorage 中以进行延迟上传。因为我为多个文件设置了它,所以我循环遍历每个文件并创建一个图像和一个画布,但无论如何它似乎每次都输出完全相同的 base64 编码图像。通过测试,我知道在每次循环迭代中,图像都是不同的,并且确实指向不同的文件 blob,但画布只是一遍又一遍地输出相同的东西,我认为这也是文件列表中的最后一个文件。有时它也会输出一个“数据”字符串,仅此而已。如果有人能指出我正确的方向,我会很高兴。
代码如下:
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);
}
});
});
【问题讨论】:
-
那是因为你的
.on("load")处理程序是异步的 -
我不确定你在问什么。它似乎在我这边工作正常。
-
当我显示画布时,它会显示每个图像并且内联图像源也是正确的,你需要澄清你想要什么,否则我帮不了你。
-
是
"image/jpeg".toDataURL()的问题吗?如果上传的图片不是.jpeg图片可能无法按预期呈现? -
叹息,我发誓,当我离开办公室时,它没有工作。相反,我只是为每个链接上传最后一张图片,不管有多少。我想我是在平行维度或什么的......
image/jpeg不是问题,因为它会像我期望的那样拉起来。此外,这些图像来自 iPad,因此它们始终是 jpeg。
标签: javascript jquery html canvas base64