Визначити оригінальний розмір зображення в браузері?


90

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


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

Відповіді:


130

У вас є 2 варіанти:

Варіант 1:

Видаліть widthі heightатрибути і читати offsetWidthіoffsetHeight

Варіант 2:

Створіть об’єкт JavaScript Image, встановіть 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
}

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


Це не працюватиме із зображеннями, які ще не завантажені. Можливо, варто налаштувати його, щоб він працював належним чином для інших людей, які натрапляють на цю відповідь.
Джеймс

11
@Gabriel, я використовую це, але з newImg.onloadфункцією, щоб переконатися, що зображення завантажується, коли я встановлюю ширину / висоту. Ви в порядку зі мною відповідно редагуючи свою відповідь?
Пекка

2
Тільки примітка: Chrome / OSX може мати проблеми із кешованими зображеннями, де за допомогою цієї техніки ви отримуєте 0 як висоту / ширину.
Девід Хеллсінг,

2
як я можу отримати ієрт і ширину повернення ... ?? тому що ці змінні не виходять за межі onload
Джек

5
@GabrielMcAdams, якщо ви додасте if(newImg.complete || newImg.readyState === 4) newImg.onload();в кінці своєї функції, це вирішить проблему в Chrome / OSX, через яку завантаження не запускається, коли зображення завантажуються з кешу.
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 році. Ось посилання з чудовим обхідним
шляхом

4
Це виграшна відповідь у 2018 році. Працює скрізь. (За таблицею сумісності браузера в MDN.)
7vujy0f0hy

3

Ви можете попередньо завантажити зображення в об’єкт javascript Image, а потім перевірити властивості ширини та висоти для цього об’єкта.


Звичайно - мені не потрібно вносити це в документ. Зроби це так, ура!
Пекка

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? Що таке висота?
Істіаке Ахмед,

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();
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.