Як отримати розмір зображення (висоту та ширину) за допомогою JavaScript?


Відповіді:


792

Ви можете програмно отримати зображення та перевірити розміри за допомогою Javascript ...

var img = new Image();
img.onload = function() {
  alert(this.width + 'x' + this.height);
}
img.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';

Це може бути корисно, якщо зображення не є частиною розмітки.


4
@ blo0p3r - зображення перед цим не потрібно завантажувати в DOM. Він завантажує зображення і знімає навантаження, щоб дати нам розміри. До речі - найкраща відповідь тут !!
Вік

Я хотів би, щоб ви могли це зробити і з XMLHttpRequest Object.
Фірст

Як я можу використовувати цей код для кількох зображень (масив)? Можливо, потрібно було б поєднати це з найкращою відповіддю звідси: stackoverflow.com/questions/4288759/… ?
Козуч

Рішення для декількох зображень тут: stackoverflow.com/questions/19269834 / ...
Kozuch

2
img.onerror = function () {alar (0); // не знайдено обробника}
Безмежна isa

437

clientWidth та clientHeight - це властивості DOM, які показують поточний розмір у веб-переглядачі внутрішніх розмірів елемента DOM (за винятком поля та межі). Так що у випадку елемента IMG це отримає фактичні розміри видимого зображення.

var img = document.getElementById('imageid'); 
//or however you get a handle to the IMG
var width = img.clientWidth;
var height = img.clientHeight;

33
@Nicky точно так. Він надає розміри зображення в міру відображення в цьому екземплярі .
Rex M

8
@ Мат-візуальний $.fn.widthі $.fn.height.
yckart

202
Правильна відповідь - використовувати img.naturalWidth та img.naturalHeight
восьминога

5
document.getElementByIdбільше набирати , але в 10 разів швидше , ніж $('#...')[0].
bfontaine

17
@RexM У Chrome 35 це в 16 разів швидше: jsperf.com/document-getelementbyid-vs-jquery/5
bfontaine

335

Також (окрім відповідей Рекса та Іна) є:

imageElement.naturalHeight

і

imageElement.naturalWidth

Вони забезпечують висоту та ширину самого файлу зображення (а не просто елемента зображення).


15
Зараз це підтримується в IE9 та всіх сучасних веб-браузерах.
Аарон

отримуйте 0x0, коли зображення не закінчилось завантаження.
брок

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

Так ... це те, що я роблю. І потім, якщо "naturalwidth" або висота повернуться як NaNs, я повертаюся до іншого методу з попередньої відповіді (отримую зображення знову як нове Image (), а потім отримую його ширину та висоту під час події завантаження. Повільніше, але таким чином він буде працювати в старих браузерах, таких як IE8.
Ренді

в разі , якщо ви хочете знати про підтримку браузера caniuse.com/#feat=img-naturalwidth-naturalheight
ULMER-Морозову

109

Якщо ви використовуєте jQuery і ви вимагаєте розмірів зображень, вам доведеться почекати, поки вони завантажуються, або ви отримаєте лише нулі.

$(document).ready(function() {
    $("img").load(function() {
        alert($(this).height());
        alert($(this).width());
    });
});

Чи завжди доступні ширина та висота у вантажника?
Anders Lindén

@ AndersLindén - перегляньте чорнило, яке додав Акселі для події завантаження. Існує специфічний розділ, присвячений зображенням. Технічна відповідь - «ні», але на практиці у мене ніколи не було проблем з нашими сайтами, які використовують цей метод.
mrtsherman

Але якщо технічна відповідь - ні, вона непридатна? Хіба це не так?
Anders Lindén

Чи можливо отримати атрибути зображення перед завантаженням?
не

98

Я думаю, що оновлення цих відповідей корисне, оскільки одна з найкращих відповідей пропонує використання clientWidthі clientHeight, які, на мою думку, зараз застаріли.

Я провів кілька експериментів з HTML5, щоб побачити, які значення фактично повертаються.

Перш за все, я використовував програму під назвою Dash, щоб отримати огляд API зображення. Вона стверджує , що heightі widthє тоноване висота / ширина зображення , і що naturalHeightі naturalWidthє внутрішня висота / ширина зображення (і тільки HTML5).

Я використав зображення прекрасного метелика, з файлу висотою 300 і шириною 400. І цей Javascript:

var img = document.getElementById("img1");

console.log(img.height,           img.width);
console.log(img.naturalHeight,    img.naturalWidth);
console.log($("#img1").height(),  $("#img1").width());

Тоді я використав цей HTML із вбудованим CSS для висоти та ширини.

<img style="height:120px;width:150px;" id="img1" src="img/Butterfly.jpg" />

Результати:

/*Image Element*/ height == 300         width == 400
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() == 120       width() == 150

/*Actual Rendered size*/    120                  150

Потім я змінив HTML на наступне:

<img height="90" width="115" id="img1" src="img/Butterfly.jpg" />

тобто використовуючи атрибути висоти та ширини, а не стилі вбудованого

Результати:

/*Image Element*/ height ==  90         width == 115
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() ==  90       width() == 115

/*Actual Rendered size*/     90                  115

Потім я змінив HTML на наступне:

<img height="90" width="115" style="height:120px;width:150px;" id="img1" src="img/Butterfly.jpg" />

тобто використовуючи обидва атрибути та CSS, щоб побачити, який має перевагу.

Результати:

/*Image Element*/ height ==  90         width == 115
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() == 120       width() == 150

/*Actual Rendered size*/    120                  150

1
Чому ви вважаєте, що висота клієнта застаріла?
Какту

64

За допомогою JQuery ви робите це:

var imgWidth = $("#imgIDWhatever").width();

63
А якщо зображення ще не завантажено?
Джеймс Вестгейт

11
а якщо зображення знаходиться у фоновому властивості діва? :)
NDM

3
@JamesWestgate Якщо зображення ще не було завантажено, не можна визначити його фактичний розмір. Однак ви можете спробувати прочитати widthта heightатрибути imgелемента.
Тім

@Tim Ви можете завантажити його у фоновому режимі, і коли його буде завантажено, ви можете мати його розміри
Одіс

26

Річ, яку всі інші забули, - це те, що ви не можете перевірити розмір зображення перед завантаженням. Коли автор перевірятиме всі опубліковані методи, він, ймовірно, працюватиме лише на localhost. Оскільки jQuery може бути використаний тут, пам’ятайте, що подія "Ready" запускається перед завантаженням зображень. $ ('# xxx'). ширина () і. висота () повинні бути запущені в події завантаження або пізніше.


9
Опублікуйте кілька оновлених кодів, ви можете отримати перевагу і навіть отримати знаковий зворотний знак розвороту!
Джеймс Вестгейт

1
@Thinker, будь ласка, надайте ваше рішення, оскільки ваш аналіз здається правильним.
a20

5
Це не відповідь. Просто коментар щодо інших відповідей.
jeffdill2

20

Це дійсно можна зробити лише за допомогою зворотного виклику події завантаження, оскільки розмір зображення не відомий, поки воно фактично не закінчиться завантаженням. Щось на зразок коду нижче ...

var imgTesting = new Image();

function CreateDelegate(contextObject, delegateMethod)
{
    return function()
    {
        return delegateMethod.apply(contextObject, arguments);
    }
}

function imgTesting_onload()
{
    alert(this.width + " by " + this.height);
}


imgTesting.onload = CreateDelegate(imgTesting, imgTesting_onload);
imgTesting.src = 'yourimage.jpg';

1
у jquery ви можете використовувати для цього $ .proxy.
Jochem Van Der Spek

9

З JQuery бібліотечно

Використовуйте .width()і .height().

Детальніше про ширину jQuery та висоту jQuery .

Приклад коду-

$(document).ready(function(){
    $("button").click(function()
    {
        alert("Width of image: " + $("#img_exmpl").width());
        alert("Height of image: " + $("#img_exmpl").height());
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

<img id="img_exmpl" src="http://images.all-free-download.com/images/graphicthumb/beauty_of_nature_9_210287.jpg">
<button>Display dimensions of img</button>


8

Ок, хлопці, я думаю, що я покращив вихідний код, щоб мати змогу дозволити завантаження зображення, перш ніж намагатись дізнатись його властивості, інакше він відобразить "0 * 0", тому що наступне твердження було б викликане до завантаження файлу в браузер. Потрібен jquery ...

function getImgSize(imgSrc){
    var newImg = new Image();
    newImg.src = imgSrc;
    var height = newImg.height;
    var width = newImg.width;
    p = $(newImg).ready(function(){
        return {width: newImg.width, height: newImg.height};
    });
    alert (p[0]['width']+" "+p[0]['height']);
}

8

Припускаючи, ми хочемо отримати розміри зображення <img id="an-img" src"...">

// Query after all the elements on the page have loaded.
// Or, use `onload` on a particular element to check if it is loaded.
document.addEventListener('DOMContentLoaded', function () {
  var el = document.getElementById("an-img");

  console.log({
    "naturalWidth": el.naturalWidth, // Only on HTMLImageElement
    "naturalHeight": el.naturalHeight, // Only on HTMLImageElement
    "offsetWidth": el.offsetWidth,
    "offsetHeight": el.offsetHeight
  });

Природні розміри

el.naturalWidthі el.naturalHeightотримає нам природні розміри , розміри файлу зображення.

Розміри макета

el.offsetWidthі el.offsetHeightотримає нам розміри, з якими елемент відображається в документі.


4
Просто підкресліть наявні відповіді, які надають корисний вміст; не копіюйте їх з декількох у новий; ви просто копіюєте вміст.
TylerH

7

Перед використанням реального розміру зображення слід завантажити вихідне зображення. Якщо ви використовуєте JQuery Framework, ви можете отримати реальний розмір зображення простим способом.

$("ImageID").load(function(){
  console.log($(this).width() + "x" + $(this).height())
})

7

Ця відповідь була саме тим, що я шукав (в jQuery):

var imageNaturalWidth = $('image-selector').prop('naturalWidth');
var imageNaturalHeight = $('image-selector').prop('naturalHeight');

5

Ви можете мати просту функцію на зразок наступної ( imageDimensions()), якщо не боїтеся обіцянок .

// helper to get dimensions of an image
const imageDimensions = file => new Promise((resolve, reject) => {
    const img = new Image()

    // the following handler will fire after the successful parsing of the image
    img.onload = () => {
        const { naturalWidth: width, naturalHeight: height } = img
        resolve({ width, height })
    }

    // and this handler will fire if there was an error with the image (like if it's not really an image or a corrupted one)
    img.onerror = () => {
        reject('There was some problem with the image.')
    }
    
    img.src = URL.createObjectURL(file)
})

// here's how to use the helper
const getInfo = async ({ target: { files } }) => {
    const [file] = files
 
    try {
        const dimensions = await imageDimensions(file)
        console.info(dimensions)
    } catch(error) {
        console.error(error)
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.0.0-beta.3/babel.min.js"></script>

Select an image:
<input
  type="file"
  onchange="getInfo(event)"
/>
<br />
<small>It works offline.</small>



3

Думав, що це може бути корисним для тих, хто використовує Javascript та / або Typescript у 2019 році.

Я виявив, що деякі, як вважають деякі, неправильні:

let img = new Image();
img.onload = function() {
  console.log(this.width, this.height) // Error: undefined is not an object
};
img.src = "http://example.com/myimage.jpg";

Це вірно:

let img = new Image();
img.onload = function() {
  console.log(img.width, img.height)
};
img.src = "http://example.com/myimage.jpg";

Висновок:

Використовуйте img, не this, у onloadфункції.


img.src вгорі має помилку друку, має бути "не: я намагався редагувати це, але не можу, тому що:" Правки повинні містити не менше 6 символів; чи є ще щось, щоб покращити цю посаду? "Інакше дуже просте рішення, яке чудово працює!
user2677034

Дякуємо @ user2677034 за те, що помітили. Я цього не бачив. Я звинувачую клавіатуру Apple. Жартую ... Це, мабуть, моя вина. ; P
Брайан

2

Нещодавно у мене виникла проблема з помилкою в повзунку flex. Висота першого зображення була встановлена ​​меншою через затримку завантаження. Я спробував наступний метод вирішення цієї проблеми, і це спрацювало.

// create image with a reference id. Id shall be used for removing it from the dom later.
var tempImg = $('<img id="testImage" />');
//If you want to get the height with respect to any specific width you set.
//I used window width here.
tempImg.css('width', window.innerWidth);  
tempImg[0].onload = function () {
    $(this).css('height', 'auto').css('display', 'none');
    var imgHeight = $(this).height();
    // Remove it if you don't want this image anymore.
    $('#testImage').remove();
}
//append to body
$('body').append(tempImg);
//Set an image url. I am using an image which I got from google.
tempImg[0].src ='http://aspo.org/wp-content/uploads/strips.jpg';

Це дасть вам висоту відносно заданої ширини, а не оригінальної ширини або нуля.


1

Ви також можете використовувати:

var image=document.getElementById("imageID");
var width=image.offsetWidth;
var height=image.offsetHeight;

1

Нікі Де Мейєр запитав після фонового зображення; Я просто дістаю його з css і замінюю "url ()":

var div = $('#my-bg-div');
var url = div.css('background-image').replace(/^url\(\'?(.*)\'?\)$/, '$1');
var img = new Image();
img.src = url;
console.log('img:', img.width + 'x' + img.height); // zero, image not yet loaded
console.log('div:', div.width() + 'x' + div.height());
img.onload = function() {
  console.log('img:', img.width + 'x' + img.height, (img.width/div.width()));
}

Я ніколи не розумів використання для цього rgexp під час використання jQuery. Оскільки jQuery нормалізує атрибут для вас, ви вийдете просто чудово, використовуючи s.substr(4,s.length-5), щонайменше простіше на очах;)
Йонас Шуберт Ерландссон

1

Ви можете застосувати властивість обробника завантаження, коли сторінка завантажується у js або jquery таким чином: -

$(document).ready(function(){
   var width = img.clientWidth;
   var height = img.clientHeight;

 });

1

Просто ви можете протестувати так.

  <script>
  (function($) {
        $(document).ready(function() {
            console.log("ready....");
            var i = 0;
            var img;
            for(i=1; i<13; i++) {
                img = new Image();
                img.src = 'img/' + i + '.jpg';
                console.log("name : " + img.src);
                img.onload = function() {
                    if(this.height > this.width) {
                        console.log(this.src + " : portrait");
                    }
                    else if(this.width > this.height) {
                        console.log(this.src + " : landscape");
                    }
                    else {
                        console.log(this.src + " : square");
                    }
                }
            }
        });
    }(jQuery));
  </script>

0
var img = document.getElementById("img_id");
alert( img.height + " ;; " + img .width + " ;; " + img .naturalHeight + " ;; " + img .clientHeight + " ;; " + img.offsetHeight + " ;; " + img.scrollHeight + " ;; " + img.clientWidth + " ;; " + img.offsetWidth + " ;; " + img.scrollWidth )
//But all invalid in Baidu browser  360 browser ...

0

важливо видалити налаштування інтерпретованого браузера з батьківського div. Тож якщо ви хочете реальної ширини та висоти зображення, ви можете просто скористатися

$('.right-sidebar').find('img').each(function(){
    $(this).removeAttr("width");
    $(this).removeAttr("height");
    $(this).imageResize();
});

Це один із прикладів проекту TYPO3 від мене, де мені потрібні реальні властивості зображення для масштабування його з правильним співвідношенням.


0
var imgSrc, imgW, imgH;
function myFunction(image){
    var img = new Image();
    img.src = image;
    img.onload = function() {   
        return {
            src:image,
            width:this.width,
            height:this.height};
        }
    return img;
}
var x = myFunction('http://www.google.com/intl/en_ALL/images/logo.gif');
    //Waiting for the image loaded. Otherwise, system returned 0 as both width and height.
x.addEventListener('load',function(){
    imgSrc = x.src;
    imgW = x.width;
    imgH = x.height;
});
x.addEventListener('load',function(){
    console.log(imgW+'x'+imgH);//276x110
});
console.log(imgW);//undefined.
console.log(imgH);//undefined.
console.log(imgSrc);//undefined.

Це мій метод, сподіваюся, це корисно. :)


0
function outmeInside() {
var output = document.getElementById('preview_product_image');

 if (this.height < 600 || this.width < 600) {
     output.src = "http://localhost/danieladenew/uploads/no-photo.jpg";
     alert("The image you have selected is low resloution image.Your image width=" + this.width + ",Heigh=" + this.height + ". Please select image greater or equal to 600x600,Thanks!");
 } else {
     output.src = URL.createObjectURL(event.target.files[0]);

 }
 return;

 }

 img.src = URL.createObjectURL(event.target.files[0]);
}

ця робота для попереднього перегляду та завантаження зображення. якщо вам доведеться вибирати для кожного з зображень по одному. Потім скопіюйте та вставте всі функції попереднього перегляду зображення та підтвердіть !!!


0

Перш ніж придбати атрибути елемента, сторінку документа слід завантажити:

window.onload=function(){
    console.log(img.offsetWidth,img.offsetHeight);
}

0

просто передайте об’єкт файлу img, який отримано вхідним елементом, коли ми виберемо правильний файл, він дасть висоту та ширину зображення

function getNeturalHeightWidth(file) {
     let h, w;
     let reader = new FileReader();
      reader.onload = () => {
        let tmpImgNode = document.createElement("img");
        tmpImgNode.onload = function() {
          h = this.naturalHeight;
          w = this.naturalWidth;
        };
        tmpImgNode.src = reader.result;
      };
      reader.readAsDataURL(file);
    }
   return h, w;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.