nor*_*rak 3 javascript base64 canvas image jszip
所以基本上我想在 zip 文件中添加一些图像并能够下载它。我有两个保存图像源的变量 - pic1、pic2和一个用于保存 base64 字符串的全局变量basePic。我有一个将图像转换为 base64 的函数:
var pic; //http://www.somesite.com/i/picture.jpg
var pic2; //http://www.somesite.com/i/picture2.jpg
var basePic;// base64 string of an image
function getBase64FromImageUrl(url) {
var img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.onload = function () {
var canvas = document.createElement("canvas");
canvas.width =this.width;
canvas.height =this.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0);
var dataURL = canvas.toDataURL("image/png");
basePic=dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
};
img.src = url; // I was trying to put this after setAttribute, but it's the same effect
}
Run Code Online (Sandbox Code Playgroud)
后来我尝试创建一个 zip 文件并像这样调用这个函数:
var zip = new JSZip();
getBase64FromImageUrl(pic);
alert("random text"); // without it, it's just empty file added to zip
zip.file("picture.png",basePic, {base64: true});
getBase64FromImageUrl(pic2);
alert("random text");
zip.file("picture2.png",basePic, {base64: true});
zip.generateAsync({type:"blob"})
.then(function(content) {
saveAs(content, "example.zip");
});
Run Code Online (Sandbox Code Playgroud)
此功能适用于一张图像,但使用多张图像会更加随机。如果我在不刷新页面的情况下运行我的代码几次,它可能会得到我需要的结果。但大部分时间在我的 zip 文件中只有第二张图片两次,我必须在调用此函数后发出警报,因为没有basePic将是空的。我想修复这个函数,以便能够轻松地将多个图像源转换为 base64 字符串。
1.如何使这个函数正常工作,input_url -> output_base64,有多个图像?
2.如何在每次调用该函数后无需提醒的情况下做到这一点?
小智 6
问题是压缩过程在图像加载之前开始。将文件添加到 zip 存档的过程必须从onload处理程序内部开始。
但是,这里也有几件事情需要考虑:
Uint8Array) 中效果更好我会提出以下方法:
XMLHttpRequests加载每个文件并请求内容为ArrayBuffer. 这将允许您将任何类型的文件直接加载为二进制格式,这将提高性能和资源。generateAsync()方法,你应该就完成了。这不是一个可用于生产的示例,也不打算如此,但它将显示主要步骤。根据您的情况进行调整,在适当的地方添加错误处理和健全性检查。
// create archive before loading process begin
var zip = new JSZip();
// image list to add:
var images = [
"//i.imgur.com/qDFCWVnb.jpg",
"//i.imgur.com/VBvzEq1b.jpg",
"//i.imgur.com/ZWtUEuLb.jpg"
],
index = 0; // for loader
// function to load a single image as arraybuffer using XMLHttpRequests
// it will assume cross-origin usage is allowed
function loadAsArrayBuffer(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.responseType = "arraybuffer";
xhr.onerror = function() {/* handle errors*/};
xhr.onload = function() {
if (xhr.status === 200) {callback(xhr.response, url)}
else {/* handle errors*/}
};
xhr.send();
}
// loading process. Here it will load one and one image.
// You can modify it to load several at once but some browsers put
// a cap on how many XHR connections can be open at the same time..
(function load() {
if (index < images.length) {
loadAsArrayBuffer(images[index++], function(buffer, url) {
var filename = getFilename(url);
zip.file(filename, buffer); // image has loaded, add it to archive
load(); // load next image
})
}
else { // done! present archive somehow
zip.generateAsync({type:"blob"}).then(function(content) {
// save out
lnk.href = (URL || webkitURL).createObjectURL(content);
lnk.innerHTML = "Right-click + Save as to download zip file";
lnk.download = "DemoZip.zip";
});
}
})();
// Just for this demo! keep separate array with filename or
// modify to allow for "filename-less" uris.
function getFilename(url) {
return url.substr(url.lastIndexOf("/") + 1)
}Run Code Online (Sandbox Code Playgroud)
<script src="https://raw.githubusercontent.com/Stuk/jszip/master/dist/jszip.min.js"></script>
Loading external lib + images... hold on...
<br><a id=lnk></a>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3623 次 |
| 最近记录: |