Определить исходный размер изображения в кросс-браузере?

90

Есть ли надежный, независимый от структуры способ определения физических размеров <img src='xyz.jpg'>измененного размера на стороне клиента?

Пекка
источник
img.onload = function () {console.log(img.height, img.width)}
neaumusic

Ответы:

130

У вас есть 2 варианта:

Опция 1:

Удалите widthи heightатрибуты и читать offsetWidthиoffsetHeight

Вариант 2:

Создайте Imageобъект JavaScript , установите srcи прочтите widthи height(для этого вам даже не нужно добавлять его на страницу).

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
}

Отредактировал Пекка : Как было согласовано в комментариях, я изменил функцию, чтобы она запускалась при событии «загрузки» изображения. В противном случае с большими изображениями heightи widthничего не вернет, потому что изображение еще не было загружено.

Габриэль Макадамс
источник
Это не будет работать с изображениями, которые еще не загружены. Возможно, стоит настроить его, чтобы другие люди, наткнувшись на этот ответ, работали должным образом.
Джеймс
11
@Gabriel, я использую это, но с newImg.onloadфункцией, чтобы убедиться, что изображение загружено, когда я устанавливаю ширину / высоту. Вы согласны с тем, что я соответствующим образом отредактирую ваш ответ?
Pekka
2
Просто примечание: у Chrome / OSX могут быть проблемы с кешированными изображениями, когда вы получаете 0 как высоту / ширину с помощью этой техники.
Дэвид Хеллсинг
2
как я могу вернуть высоту и ширину ... ?? потому что эти переменные не выходят за пределы onload
jack
5
@GabrielMcAdams, если вы добавите if(newImg.complete || newImg.readyState === 4) newImg.onload();в конце своей функции, это исправит проблему в Chrome / OSX, из-за которой onload не срабатывает при загрузке изображений из кеша.
Престол
102

Изображения (по крайней мере, в Firefox) имеют naturalWidthсвойство / height, поэтому вы можете использовать его img.naturalWidthдля получения исходной ширины.

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

Источник

Bugster
источник
8
Работает и в Chrome
bcoughlan
4
Эта тема все еще актуальна в 2013 году. Вот ссылка с отличным обходным путем
BurninLeo
4
Это лучший ответ в 2018 году. Работает везде. (Согласно таблице совместимости браузеров на сайте MDN.)
7vujy0f0hy
3

Вы можете предварительно загрузить изображение в объект Image javascript, а затем проверить свойства ширины и высоты этого объекта.

Майлз
источник
Конечно - в документ не обязательно. Так и сделаю, ура!
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);
Римский
источник
это elementвыбор JQuery? Что насчет высоты?
Istiaque Ahmed
2

Просто немного изменив второй вариант Габриэля, чтобы его было проще использовать:

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();
});
Вагнер Бертолини Младший
источник