确定图像跨浏览器的原始大小?


90

是否有可靠的,独立于框架的方法来确定<img src='xyz.jpg'>客户端调整大小的物理尺寸?


img.onload = function () {console.log(img.height, img.width)}
neaumusic

Answers:


130

您有2个选择:

选项1:

删除widthheight属性,然后读取offsetWidthoffsetHeight

选项2:

创建一个JavaScript Image对象,设置src,然后读取widthheight(您甚至不必将其添加到页面中即可执行此操作)。

function getImgSize(imgSrc) {
    var newImg = new Image();

    newImg.onload = function() {
      var height = newImg.height;
      var width = newImg.width;
      alert ('The image size is '+width+'*'+height);
    }

    newImg.src = imgSrc; // this must be done AFTER setting onload
}

由Pekka编辑:按照注释中的约定,我更改了在图像的“ onload”事件上运行的功能。否则,大图像,heightwidth不会因为在拍摄时尚未加载任何回报。


这不适用于尚未加载的图像。可能需要对其进行调整以使其适合在此答案中绊脚石的其他人正常工作。
詹姆斯,

11
@Gabriel,我正在使用此newImg.onload功能,但是具有确保在设置宽度/高度时加载图像的功能。您可以接受我相应地编辑答案吗?
Pekka 2010年

2
请注意:Chrome / OSX缓存的图片可能会出现问题,使用此技术您将高度/宽度设置为0。
David Hellsing

2
我如何获得返回的高度和宽度...?因为这些变量没有超出负载范围
杰克

5
@GabrielMcAdams,如果if(newImg.complete || newImg.readyState === 4) newImg.onload();在函数末尾添加,它将解决Chrome / OSX上的问题,该问题导致从缓存加载图像时onload不触发。
Prestaul

101

图像(至少在Firefox上)具有naturalWidth/ height属性,因此您可以img.naturalWidth用来获取原始宽度

var img = document.getElementsByTagName("img")[0];
img.onload=function(){
    console.log("Width",img.naturalWidth);
    console.log("Height",img.naturalHeight);
}

资源


8
适用于Chrome太
bcoughlan

4
这个主题在2013年仍然有意义。这是IE7 / 8的一个很好的变通方法的链接:jacklmoore.com/notes/naturalwidth-and-height-in-ie
BurninLeo 2013年

4
这是2018年的最佳答案。无处不在。(每个浏览器的兼容性表均位于MDN。)
7vujy0f0hy

3

您可以将图像预加载到javascript图像对象中,然后检查该对象的width和height属性。


当然-我不必将其放入文档中。那样做,加油!
Pekka

3
/* Function to return the DOM object's in crossbrowser style */
function widthCrossBrowser(element) {
    /* element - DOM element */

    /* For FireFox & IE */
    if(     element.width != undefined && element.width != '' && element.width != 0){
        this.width  =   element.width;
    }
    /* For FireFox & IE */
    else if(element.clientWidth != undefined && element.clientWidth != '' && element.clientWidth != 0){
        this.width  =   element.clientWidth;
    }
    /* For Chrome * FireFox */
    else if(element.naturalWidth != undefined && element.naturalWidth != '' && element.naturalWidth != 0){
        this.width  =   element.naturalWidth;
    }
    /* For FireFox & IE */
    else if(element.offsetWidth != undefined && element.offsetWidth != '' && element.offsetWidth != 0){
        this.width  =   element.offsetWidth;
    }       
        /*
            console.info(' widthWidth width:',      element.width);
            console.info(' clntWidth clientWidth:', element.clientWidth);
            console.info(' natWidth naturalWidth:', element.naturalWidth);
            console.info(' offstWidth offsetWidth:',element.offsetWidth);       
            console.info(' parseInt(this.width):',parseInt(this.width));
        */
    return parseInt(this.width);

}   

var elementWidth    = widthCrossBrowser(element);

elementjQuery选择吗?什么是高度?
Istiaque Ahmed '18

2

只需稍微改变一下Gabriel的第二个选项,使其更易于使用:

function getImgSize(imgSrc, callback) {
    var newImg = new Image();

    newImg.onload = function () {
        if (callback != undefined)
            callback({width: newImg.width, height: newImg.height})
    }

    newImg.src = imgSrc;
}

HTML:

<img id="_temp_circlePic" src="http://localhost/myimage.png" 
style="width: 100%; height:100%">

样品电话:

getImgSize($("#_temp_circlePic").attr("src"), function (imgSize) {
    // do what you want with the image's size.
    var ratio = imgSize.height / $("#_temp_circlePic").height();
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.