【问题标题】:I'm trying to get the height of the image from base64我正在尝试从 base64 获取图像的高度
【发布时间】:2021-03-17 18:14:43
【问题描述】:

我正在尝试从 base64 获取图像的高度。这是我的代码,

let reader = new FileReader()
reader.readAsDataURL(file);
reader.onloadend = function() {
    let img = document.createElement('img');
    img.src = reader.result; //data:image/png;base64,...
    console.log(img.height);
}

查看日志返回 0。

这样怎么获取图片的高度?

完整代码

function handleDrop(e) {
    var dt = e.dataTransfer
    var files = dt.files

    handleFiles(files)
}

function handleFiles(files) {
    files = [...files]
    files.forEach(previewFile)
}

function previewFile(file) {
    let reader = new FileReader()

    reader.readAsDataURL(file);
    reader.onload = function() {
        let img = document.createElement('img');
        let div = document.createElement('div');

        img.src = reader.result;
        div.appendChild(img);

        document.getElementById('gallery').appendChild(div);
    }
}

dropArea.addEventListener('drop', handleDrop, false)

【问题讨论】:

标签: javascript


【解决方案1】:
  • 在可能的情况下,您应该在脚本中使用 createObjectURL 而不是使用 data:-URI,因为 data:-URI 需要将整个对象作为字符串序列化到内存中,并使用 1/3 的额外内存使用(因此,如果您有一个 1MB 大小的图像,您现在需要 额外的 1.33MB 仅用于 data: URI 字符串,而对象 URL 通常只是一个简短的 GUID)。
    • 创建数据 URI 也是同步的,并且会阻塞 UI 线程 - 您可以通过从大图像或视频创建 data: URI 轻松冻结 Chrome 选项卡。
    • createObjectURL 非常非常便宜 - 唯一需要注意的是您需要查看 URL 的生命周期并确保使用 revokeObjectURL

把你的代码改成这个。

请注意,FileReader 根本不需要。

async function printImageDimensions( file ) {
    
    if( !file ) return;
    if( !( file instanceof File ) ) return;

    //

    const img = document.createElement( 'img' );
    
    const objUrl = URL.createObjectURL( file );
    try {
        
        const dim = await loadImageAsync( img, objUrl );

        console.log( "Width: %d, Height: %d", dim.w, dim.h );
    }
    finally {
        URL.revokeObjectURL( objUrl );
    }
}

function loadImageAsync( img, url ) {
    
    return new Promise( ( resolve, reject ) => {
        
        function onLoad() {
            const ret = { w: img.naturalWidth, h: img.naturalHeight };
            resolve( ret );
        }

        function onError() {
            reject( "Load failed." );
        }

        img.addEventListener( 'load', onLoad );
        img.addEventListener( 'error', onError );

        img.src = url;
        
    } );
}

【讨论】:

  • 试过 reader.createObjectURL(file); 我得到错误说不是函数
  • 我用完整的代码更新了这个问题.. 这样你就可以清楚地看到我想要做什么
  • @Fil 是URL.createObjectURL,不是reader.createObjectURL,正如我所说,你根本不需要FileReader
  • 是的,它有效..对不起,我没有正确遵循
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2014-07-15
相关资源
最近更新 更多