data:image/jpeg; base64如何获取其宽度和高度(以像素为单位)

Alo*_*lon 6 javascript jquery

你如何获得像素的图像宽度和高度,其src在数据中:image/jpeg; base64?

没有成功使用设置img.src然后调用width().

var img = jQuery("<img src="+oFREvent.target.result+">");
img.width() // = 0
Run Code Online (Sandbox Code Playgroud)

ade*_*neo 5

这将有效:

var img = new Image();
img.onload = function() {
    alert(this.width);
}
img.src = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAA.......";
Run Code Online (Sandbox Code Playgroud)

小提琴

我通过在此处转换图像确保base64有效,并且onload函数应该在设置图像源之前进行.


mas*_*erk 2

您必须等待图像加载(或完成,如果缓存)。这将导致异步回调操作:

// pure JS:

var img = new Image();
img.src = myDataString;
if (img.complete) { // was cached
    alert('img-width: '+img.width);
}
else { // wait for decoding
    img.onload = function() {
       alert('img-width: '+img.width);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我曾经在使用 jQuery 的项目中遇到过同样的问题。创建图像后,jQuery 无法直接提供对图像的访问。看起来,这是不可能完成的,但是在纯JS中。但是您可以尝试超时循环并等待 img-width 具有值(并捕获任何加载/解码错误)。

[编辑,另请参阅评论]为什么这有效(为什么没有竞争条件):

JS 是单线程的,这意味着在给定时间只执行一部分代码。任何事件都将排队,直到退出当前作用域,然后才会触发。由于后期绑定,任何侦听器都只会在那时(在执行当前作用域之后)进行评估。因此,一旦 onload-Event 被触发,处理程序就会出现并进行侦听,无论侦听器是在设置 src-attribute 之前还是之后设置的。与此相反,一旦设置了 src-attribute,就会设置complete-flag。