使用 Javascript File API 获取图像尺寸

IT技术 javascript thumbnails fileapi
2021-02-08 13:56:06

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

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

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

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

4个回答

是的,阅读文件作为数据URL和传递数据的URL到srcImagehttp://jsfiddle.net/pimvdb/eD2Ez/2/

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
img.onload = function() { 从不触发
2021-03-24 13:56:06
img.onloadonload事件的处理程序,Image只有在加载某些内容后才会调用。在这种情况下img.src = fr.result;会触发onload事件。从语义上讲,您希望在您的事件可能触发之前绑定您的事件处理程序。如果onload未触发,则尝试img.onerror = function(err) { console.error(err); }查看文件阅读器是否无法加载Image可以处理的内容。(或者如果其他地方出了问题)
2021-03-29 13:56:06
img.src = fr.result;之前img.onload
2021-04-10 13:56:06

或者使用一个对象 URL:http : //jsfiddle.net/8C4UB/

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

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

img.src = url;
这种方法不会将图像加载到内存中。readAsDataURL 确实如此。stackoverflow.com/questions/6217652/...
2021-04-01 13:56:06
通常最好在onload处理程序中撤销 url : URL.revokeObjectURL(url)
2021-04-11 13:56:06

现有的答案对我帮助很大。然而,由于事件而导致事件的奇怪顺序img.onload让我觉得有些混乱。所以我调整了现有的解决方案,并将它们与基于Promise的方法结合起来。也许这对其他人有帮助。

这是一个函数,返回一个带有维度作为对象的Promise:

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
})
我在互联网上找到的唯一相关答案。非常感谢先生ヽ( ̄д ̄)ノ
2021-03-30 13:56:06

我在我的项目中将 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!");
    }
}