使用Javascript File API获取图像尺寸

时间:2011-09-18 08:12:42

标签: javascript thumbnails fileapi

我需要在Web应用程序中生成图像的缩略图。我使用Html 5 File API生成缩略图。

我利用以下网址中的示例来生成缩略图。

http://www.html5rocks.com/en/tutorials/file/dndfiles/

我已成功生成缩略图。我遇到的问题是我只能使用静态大小生成缩略图。有没有办法从所选文件中获取文件尺寸,然后创建Image对象?

4 个答案:

答案 0 :(得分:105)

是的,请将该文件作为数据网址阅读,并将该数据网址传递给src http://jsfiddle.net/pimvdb/eD2Ez/2/Image

var fr = new FileReader;

fr.onload = function() { // file is loaded
    var img = new Image;

    img.onload = function() {
        alert(img.width); // image is loaded; sizes are available
    };

    img.src = fr.result; // is the data URL because called with readAsDataURL
};

fr.readAsDataURL(this.files[0]); // I'm using a <input type="file"> for demonstrating

答案 1 :(得分:16)

或使用对象网址:http://jsfiddle.net/8C4UB/

var url = URL.createObjectURL(this.files[0]);
var img = new Image;

img.onload = function() {
    alert(img.width);
};

img.src = url;

答案 2 :(得分:3)

我已经在我的项目中将pimvdb答案包含在一个通用函数中:

function checkImageSize(image, minW, minH, maxW, maxH, cbOK, cbKO){
    //check whether browser fully supports all File API
    if (window.File && window.FileReader && window.FileList && window.Blob) {
        var fr = new FileReader;
        fr.onload = function() { // file is loaded
            var img = new Image;
            img.onload = function() { // image is loaded; sizes are available
                if(img.width < minW || img.height < minH || img.width > maxW || img.height > maxH){  
                    cbKO();
                }else{
                    cbOK();
                }
            };
            img.src = fr.result; // is the data URL because called with readAsDataURL
        };
        fr.readAsDataURL(image.files[0]);
    }else{
        alert("Please upgrade your browser, because your current browser lacks some new features we need!");
    }
}    

答案 3 :(得分:0)

现有答案对我有很大帮助。但是,由于img.onload事件引起的事件的奇数顺序使我有些混乱。因此,我调整了现有解决方案,并将其与基于承诺的方法结合在一起。也许这可以帮助其他人。

这是一个以尺寸为对象返回承诺的函数:

const getHeightAndWidthFromDataUrl = dataURL => new Promise(resolve => {
  const img = new Image()
  img.onload = () => {
    resolve({
      height: img.height,
      width: img.width
    })
  }
  img.src = dataURL
})

以下是如何通过异步功能使用它:

// Get a file from an input field
const file = document.querySelector('[type="file"]').files[0]

// Get the data URL of the image as a string
const fileAsDataURL = window.URL.createObjectURL(file)

// Get dimensions 
const someFunction = async () => {
  const dimensions = await getHeightAndWidthFromDataUrl(fileAsDataURL)
  // Do something with dimensions ...
}

这是使用then()语法的方式:

// Get a file from an input field
const file = document.querySelector('[type="file"]').files[0]

// Get the data URL of the image as a string
const fileAsDataURL = window.URL.createObjectURL(file)

// Get the dimensions
getHeightAndWidthFromDataUrl(fileAsDataURL).then(dimensions => {
  // Do something with dimensions
})