使用 Javascript 文件 API 获取图像尺寸
Posted
技术标签:
【中文标题】使用 Javascript 文件 API 获取图像尺寸【英文标题】:Getting Image Dimensions using Javascript File API 【发布时间】:2011-11-19 14:09:55 【问题描述】:我需要在我的 Web 应用程序中生成图像的缩略图。我使用 html 5 File API 来生成缩略图。
我利用以下 URL 中的示例生成缩略图。
http://www.html5rocks.com/en/tutorials/file/dndfiles/
我能够成功生成缩略图。我遇到的问题是我只能通过使用静态大小来生成缩略图。有没有办法从所选文件中获取文件尺寸,然后创建 Image 对象?
【问题讨论】:
有用链接:***.com/questions/12570834/… 【参考方案1】:是的,将文件作为数据 URL 读取并将该数据 URL 传递给 Image
的 src
:http://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()
从不触发
在img.onload
之前做img.src = fr.result;
img.onload
是onload
上Image
事件的处理程序,并且只会在加载某些内容后调用。在这种情况下,img.src = fr.result;
将触发 onload
事件。从语义上讲,您希望在您的事件可能触发之前绑定您的事件处理程序。如果onload
没有触发,请尝试img.onerror = function(err) console.error(err);
以查看文件读取器是否未能加载Image
可以处理的内容。 (或者如果出现其他问题)【参考方案2】:
或使用对象 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 可以。 ***.com/questions/6217652/… 一般情况下最好撤销onload
处理程序中的url:URL.revokeObjectURL(url)
。【参考方案3】:
现有的答案对我帮助很大。但是,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
)
【讨论】:
我在互联网上找到的唯一相关答案。非常感谢先生ヽ( ̄д ̄)ノ【参考方案4】:我在我的项目中将 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!");
【讨论】:
以上是关于使用 Javascript 文件 API 获取图像尺寸的主要内容,如果未能解决你的问题,请参考以下文章
JS - File Reader API 获取图像文件大小和尺寸
有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?
使用 Shopify API 获取当前产品 ID 以进行 Javascript API 调用
使用 Javascript Fetch API 发送的快速解析文件
使用 JavaScript/jQuery 从输入类型“文件”中获取二进制图像数据,以便在 WebMatrix 中使用 AJAX 进行图片预览 [重复]