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

Determine original size of image cross browser?

提问人:Pekka 提问时间:12/22/2009 更新时间:11/30/2022 访问量:97707

问:

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

JavaScript 图像

评论

0赞 neaumusic 2/10/2017
img.onload = function () {console.log(img.height, img.width)}

答:

3赞 Myles 12/22/2009 #1

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

评论

0赞 Pekka 12/22/2009
当然 - 我不必把它放到文档中。会这样做的,干杯!
133赞 Gabriel McAdams 12/22/2009 #2

您有 2 个选择:

选项 1:

删除 and 属性,并读取 和widthheightoffsetWidthoffsetHeight

选项 2:

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

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

评论

0赞 James 12/22/2009
这不适用于尚未加载的图像。可能值得调整它以使其适用于其他偶然发现此答案的人。
11赞 Pekka 1/3/2010
@Gabriel,我正在使用它,但有一个功能可以确保在我设置宽度/高度时加载图像。你能接受我相应地编辑你的答案吗?newImg.onload
2赞 David Hellsing 2/18/2011
附带说明:Chrome/OSX 在缓存图像方面可能会出现问题,使用这种技术时,您可以获得 0 作为高度/宽度。
3赞 jack 6/22/2012
我如何获得退货高度和宽度......??因为这些变量没有超出 onload
5赞 Prestaul 5/22/2013
@GabrielMcAdams,如果您在函数末尾添加,它将解决 Chrome/OSX 上的问题,该问题导致从缓存加载图像时无法触发 onload。if(newImg.complete || newImg.readyState === 4) newImg.onload();
118赞 Bugster 12/21/2011 #3

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

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

评论

4赞 BurninLeo 10/18/2013
这个话题在2013年仍然适用。下面是一个链接,其中包含 IE7/8 的一个很好的解决方法: jacklmoore.com/notes/naturalwidth-and-naturalheight-in-ie
5赞 7vujy0f0hy 7/29/2018
这是2018年的制胜法宝。无处不在。(根据 MDN 上的浏览器兼容性表
1赞 pouya 5/19/2022
if (currentYear >= 2022)您必须使用此选项。
3赞 Roman 2/6/2016 #4
/* 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);

评论

0赞 Istiaque Ahmed 7/17/2018
是jQuery选择吗?什么是身高?element
2赞 Wagner Bertolini Junior 9/23/2016 #5

只是稍微更改了 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();
});
0赞 Asim Ali 11/30/2022 #6

对 Gabriel 的第二个选项进行调整,以帮助使用 react-grid-gallery 的人。

const [images, setImages] = useState([])

const getImgSize = function (imgSrc, index) {
    var newImg = new Image()

    newImg.onload = function () {
        setImages((images) => [
            ...images,
            {
                id: index,
                src: imgSrc,
                thumbnail: imgSrc,
                width: newImg.width,
                height: newImg.height,
            },
        ])
    }

    newImg.src = imgSrc
}

在 useEffect 中,可以调用此方法

gallery_urls?.map((url, index) => {
            getImgSize(url, index)
        })