文件阅读器图像缩略图滞后
Filereader image thumbnail lags
我正在使用 Filereader API 显示上传照片的小缩略图。但是我遇到了问题。当你上传非常大的图片,并且你上传了一些这样的图片时,它就会开始滞后。缩略图真的很小,但文件太大了。有没有办法来解决这个问题?这是我的 javascript:
document.querySelector('input').addEventListener('change', function(e){
var files = e.target.files;
for(var i = 0; i < files.length; i++){
var f = files[i];
var reader = new FileReader();
reader.onload = (function(tf){
return function(evt){
document.querySelector('.thumbs').innerHTML += '<div class="thumb" style="background-image: url('+evt.target.result+')"></div>';
}
})(f);
reader.readAsDataURL(f);
}
});
这里有一个 fiddle,您可以在其中进行测试:https://jsfiddle.net/snx79yw2/1/。
例如,我用 6000x4000 的照片对其进行了测试,当超过 4、5 时它们开始滞后(而且我的 PC 相当不错,所以它不应该那样滞后)。
顺便说一句,延迟我指的是减速、冻结等,而不是实际延迟。
我找到了 this post,但我真的不知道如何实施该答案的解决方案。提前致谢!
此示例使用 Canvas 将图像的最大宽度调整为 127 像素,然后再将它们显示在缩略图列表中。
document.querySelector('input').addEventListener('change', function(e){
var files = e.target.files;
for(var i = 0; i < files.length; i++){
var f = files[i];
var reader = new FileReader();
reader.onload = (function(tf) {
return function(evt) {
// resize the image before using the resolved dataURL to set the thumbnail src
resize(evt.target.result, 127, function(dataURL) {
document.querySelector('.thumbs').innerHTML += `<img class="thumb" src="${dataURL}" />`;
});
}
})(f)
reader.readAsDataURL(f);
}
});
/**
* usage resize( dataURL:src, int:maxWidth, function:callback)
*/
function resize(src, maxWidth, callback) {
var img = document.createElement('img');
img.src = src;
img.onload = () => {
var oc = document.createElement('canvas');
var ctx = oc.getContext('2d');
// resize to [maxWidth] px
var scale = maxWidth / img.width;
oc.width = img.width * scale;
oc.height = img.height * scale;
ctx.drawImage(img, 0, 0, oc.width, oc.height);
// convert canvas back to dataurl
callback(oc.toDataURL());
}
}
.thumbs{background: #222;border-radius: 5px;white-space: nowrap;overflow-x: scroll;padding: .25rem;}
.thumb{height: 3rem;width: 3rem;border-radius: 3px;background-size: cover;background-position: center center;background-repeat: no-repeat;display: inline-block;margin: .25rem .25rem calc(.25rem - 4px);}
<input type="file" multiple />
<div class="thumbs"></div>
我正在使用 Filereader API 显示上传照片的小缩略图。但是我遇到了问题。当你上传非常大的图片,并且你上传了一些这样的图片时,它就会开始滞后。缩略图真的很小,但文件太大了。有没有办法来解决这个问题?这是我的 javascript:
document.querySelector('input').addEventListener('change', function(e){
var files = e.target.files;
for(var i = 0; i < files.length; i++){
var f = files[i];
var reader = new FileReader();
reader.onload = (function(tf){
return function(evt){
document.querySelector('.thumbs').innerHTML += '<div class="thumb" style="background-image: url('+evt.target.result+')"></div>';
}
})(f);
reader.readAsDataURL(f);
}
});
这里有一个 fiddle,您可以在其中进行测试:https://jsfiddle.net/snx79yw2/1/。
例如,我用 6000x4000 的照片对其进行了测试,当超过 4、5 时它们开始滞后(而且我的 PC 相当不错,所以它不应该那样滞后)。
顺便说一句,延迟我指的是减速、冻结等,而不是实际延迟。
我找到了 this post,但我真的不知道如何实施该答案的解决方案。提前致谢!
此示例使用 Canvas 将图像的最大宽度调整为 127 像素,然后再将它们显示在缩略图列表中。
document.querySelector('input').addEventListener('change', function(e){
var files = e.target.files;
for(var i = 0; i < files.length; i++){
var f = files[i];
var reader = new FileReader();
reader.onload = (function(tf) {
return function(evt) {
// resize the image before using the resolved dataURL to set the thumbnail src
resize(evt.target.result, 127, function(dataURL) {
document.querySelector('.thumbs').innerHTML += `<img class="thumb" src="${dataURL}" />`;
});
}
})(f)
reader.readAsDataURL(f);
}
});
/**
* usage resize( dataURL:src, int:maxWidth, function:callback)
*/
function resize(src, maxWidth, callback) {
var img = document.createElement('img');
img.src = src;
img.onload = () => {
var oc = document.createElement('canvas');
var ctx = oc.getContext('2d');
// resize to [maxWidth] px
var scale = maxWidth / img.width;
oc.width = img.width * scale;
oc.height = img.height * scale;
ctx.drawImage(img, 0, 0, oc.width, oc.height);
// convert canvas back to dataurl
callback(oc.toDataURL());
}
}
.thumbs{background: #222;border-radius: 5px;white-space: nowrap;overflow-x: scroll;padding: .25rem;}
.thumb{height: 3rem;width: 3rem;border-radius: 3px;background-size: cover;background-position: center center;background-repeat: no-repeat;display: inline-block;margin: .25rem .25rem calc(.25rem - 4px);}
<input type="file" multiple />
<div class="thumbs"></div>