通过HTML5文件阅读器在本地读取大图像缩略图 [英] Reading large images as thumbnails locally via HTML5 filereader

查看:96
本文介绍了通过HTML5文件阅读器在本地读取大图像缩略图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图按照这里所述的缩略图的形式加载本地图片。我的代码如下。



这适用于小图片。但是,当您尝试加载较大的图像时(例如4mb),会有很大的滞后。有什么办法可以优化吗?

谢谢

Html



 < input type =fileid =filesname =files []multiple /> 
< output id =list>< / output>



Javascript



 <脚本> 
函数handleFileSelect(evt){
var files = evt.target.files; // FileList对象

//循环FileList并以缩略图形式呈现图像文件。
for(var i = 0,f; f = files [i]; i ++){

//仅处理图像文件。
if(!f.type.match('image。*')){
continue;
}

var reader = new FileReader();

//关闭捕获文件信息。
reader.onload =(function(theFile){
return function(e){
// Render thumbnail。
var span = document.createElement('span');
span.innerHTML = ['< img class =thumbsrc =',e.target.result,
'title =',escape(theFile.name),'/> gt ;']。join('');
document.getElementById('list')。insertBefore(span,null);
};
})(f);

//将图像文件读入数据URL。
reader.readAsDataURL(f);


$ b $ document.getElementById('files')。addEventListener('change',handleFileSelect,false);
< / script>


解决方案

主UI线程涉及在巨大的斑点中操纵非流数据。滞后不是来自读取数据,而是解码并在浏览器UI中显示图像,因为这涉及在CPU和GPU内存中推动大像素阵列的同步UI操作。这是因为< img> 在实际图像数据大小(宽度*高度)的块中分配和移动内存,这对于大图像是非常大的量,将它推到GPU上以便在屏幕上显示它(导致延迟几毫秒)。

您可以通过将图像缩小为可显示来优化您的用例大小,而阅读它





然而,尽管这里描述的解决方案接近完美,但要实现这一点,需要拥有先进的Javasc技巧和解决方案不会与传统兼容(阅读:微软)。

I am trying to load local images as thumbnails as explained here. My code is below.

This works fine for small images. However, when you try load larger images (e.g. 4mb) there is a huge lag. Is there any way to optimize this?

Thanks

Html

<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>

Javascript

<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object

// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {

  // Only process image files.
  if (!f.type.match('image.*')) {
    continue;
  }

  var reader = new FileReader();

  // Closure to capture the file information.
  reader.onload = (function(theFile) {
    return function(e) {
      // Render thumbnail.
      var span = document.createElement('span');
      span.innerHTML = ['<img class="thumb" src="', e.target.result,
                        '" title="', escape(theFile.name), '"/>'].join('');
      document.getElementById('list').insertBefore(span, null);
    };
  })(f);

  // Read in the image file as a data URL.
  reader.readAsDataURL(f);
}
}

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

解决方案

There is always a lag when you run something in the main UI thread which involves manipulating non-streaming data in huge blobs. The lag does not come from reading he data, but decoding and displaying the image in the browser UI as this involves synchronous UI operations pushing the large pixel array around in CPU and GPU memory. This is because <img> allocates and moves around memory in the blocks of actual image data size (width * height) which is very large amount for big images and unnecessary detailed to push it up to GPU for just showing it on the screen (causes the lag of several milliseconds).

You can most likely optimize your use case by shrinking the image to displayable size while reading it

However, though the solution described here is near perfect, to implement this one needs to possess advanced Javascript skills and the solution is not going to be legacy compatible (read: Microsoft).

这篇关于通过HTML5文件阅读器在本地读取大图像缩略图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆