javascript - 我正在尝试从 base64 获取图像的高度
问题描述
我正在尝试从 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)
解决方案
- 在可能的情况下,您应该在脚本中使用
createObjectURL
而不是使用-URI,因为-URI 需要将整个对象作为字符串序列化到内存中,并使用 1/3 的额外内存使用(因此,如果您有一个 1MB 大小的图像,您现在需要一个额外的1.33MB仅用于URI 字符串,而对象 URL 通常只是一个简短的 GUID)。data:
data:
data:
- 创建数据 URI 也是同步的,并且会阻塞 UI 线程 - 您可以通过
data:
从大图像或视频创建 URI 来轻松冻结 Chrome 选项卡。 - 然而
createObjectURL
非常非常便宜——唯一的问题是你需要观察 URL 的生命周期并确保你使用revokeObjectURL
.
- 创建数据 URI 也是同步的,并且会阻塞 UI 线程 - 您可以通过
将您的代码更改为此。
请注意,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;
} );
}
推荐阅读
- java - 如何在springboot中异步调用相同的API
- sql - 此查询语句的 SQL 相关问题
- python - 当元素就在那儿时,硒无法找到该元素
- mysql - 我正在尝试使用具有可变 FK 的模式创建表(订单)
- hybris - Hybris 的新开发流程
- android-studio - 模拟器错误:“无法访问 'C:\Users\...\.emulator_console_auth_token':模拟器控制台将无法工作”,用户名使用西里尔文
- flutter - Observable 在 rxdart 0.23.1 中已弃用
- postgresql - Postgres 两个类似的查询,一个使用正确的索引,一个没有
- algorithm - 当某些点被阻挡时到达终点的最小跳跃
- sorting - 验证Shell Sorting算法循环不变量?