Как получить размер изображения (высота и ширина) с помощью JavaScript?

Ответы:

793

Вы можете программно получить изображение и проверить размеры, используя 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.
PHearst
Как я могу использовать этот код для нескольких (массив) изображений? Вероятно, нужно было бы объединить его с лучшим ответом здесь: stackoverflow.com/questions/4288759/… ?
Козуч
Решение для нескольких изображений здесь: stackoverflow.com/questions/19269834/…
Kozuch
2
img.onerror = function () {alert (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
@ Ники точно. Он дает размеры изображения в том виде, в котором он представлен в этом случае .
Рекс М
8
@ Мат-визуал $.fn.widthи $.fn.height.
13
202
Правильный ответ - использовать img.naturalWidth и img.naturalHeight
Octopus
5
document.getElementByIdдлиннее, но в 10 раз быстрее, чем $('#...')[0].
bfontaine
17
@RexM В Chrome 35 это в 16 раз быстрее: jsperf.com/document-getelementbyid-vs-jquery/5
bfontaine
336

Также (в дополнение к ответам Рекса и Яна) есть:

imageElement.naturalHeight

а также

imageElement.naturalWidth

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

olliej
источник
15
Теперь это поддерживается в IE9 и во всех современных веб-браузерах.
Аарон
получить 0x0, когда изображение не закончило свою загрузку.
битый
1
Я использую Chrome, и это работает только в том случае, если размер изображения в DOM не меняется после загрузки страницы.
Джонатан Читкович
Да ... это то, что я делаю. И потом, если «естественная ширина» или высота возвращаются как NaN, я возвращаюсь к другому методу из предыдущего ответа (снова получаю изображение как новый Image (), а затем получаю его ширину и высоту во время события onload). Медленнее, но таким образом он будет работать в старых браузерах, таких как IE8
Рэнди
если вы хотите узнать о поддержке браузера caniuse.com/#feat=img-naturalwidth-naturalheight
ulmer-morozov
109

Если вы используете jQuery и запрашиваете размеры изображений, вам нужно подождать, пока они загрузятся, иначе вы получите только нули.

$(document).ready(function() {
    $("img").load(function() {
        alert($(this).height());
        alert($(this).width());
    });
});
mrtsherman
источник
Всегда ли ширина и высота доступны в загрузчике?
Андерс Линден
@ AndersLindén - посмотрите чернила, которые Аксели добавил для события загрузки. Существует специальный раздел, посвященный изображениям. Технический ответ - «нет», но на практике у меня никогда не было проблем с нашими сайтами, которые используют этот метод.
Мртшерман
Но если технического ответа нет, это непригодно? Не так ли?
Андерс Линден
Можно ли получить атрибуты изображения до его загрузки?
нет nein
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
paulo62
источник
1
Почему вы думаете, что clientHeight устарел?
Cactux
64

Используя JQuery, вы делаете это:

var imgWidth = $("#imgIDWhatever").width();
Ян Саттл
источник
63
А если изображение еще не загружено?
Джеймс Вестгейт
11
а если изображение находится в фоновом свойстве div? :)
NDM
3
@JamesWestgate Если изображение еще не загружено, нет способа определить его фактический размер. Однако вы могли бы попытаться прочитать widthи heightатрибуты imgэлемента.
Тим
@Tim Вы можете загрузить его в фоновом режиме, а когда он загружен, вы можете иметь его размеры
Odys
26

Все, что другие забыли, это то, что вы не можете проверить размер изображения перед его загрузкой. Когда автор проверяет все опубликованные методы, он будет работать только на localhost. Поскольку здесь можно использовать jQuery, помните, что событие 'ready' вызывается до загрузки изображений. $ ('# xxx'). width () и .height () должны быть запущены в событии onload или позже.

мыслитель
источник
9
Разместите обновленный код, вы можете получить голосование и даже получить желанный значок разворота!
Джеймс Вестгейт
1
@ Thinker, пожалуйста, предоставьте ваше решение, потому что ваш анализ кажется правильным.
а20
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 для этого.
Йохем Ван Дер Спек
9

С библиотекой jQuery

Используйте .width()и .height().

Подробнее в ширину JQuery и JQuery heigth .

Пример кода

$(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']);
}
Claudio
источник
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получит нам размеры, при которых элемент отображается в документе.

Saneef
источник
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');
dev101
источник
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

JQuery Ответ:

$height = $('#image_id').height();
$width  = $('#image_id').width();
Эли Геске
источник
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 есть опечатка, должно быть "not: я пытался отредактировать это, но не могу, потому что:" Edits должно содержать не менее 6 символов; Есть ли что-то еще, чтобы улучшить в этом посте? "В противном случае очень простое решение, которое отлично работает!
user2677034
Спасибо @ user2677034 за замечание. Я этого не видел. Я буду винить клавиатуру Apple. Шучу ... Это была моя вина. ; P
Брайан
2

Недавно у меня возникла та же проблема с ошибкой в ​​флайдере. Высота первого изображения была установлена ​​меньше из-за задержки загрузки. Я попытался следующий метод для решения этой проблемы, и это сработало.

// 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;
praveenjayapal
источник
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()));
}
Hraban
источник
Я никогда не понимал использование регулярных выражений для этого при использовании jQuery. Так как jQuery нормализует атрибут для вас, вы прекрасно справляетесь с s.substr(4,s.length-5)этим, на глаза это как минимум легче;)
Jonas Schubert Erlandsson
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>
cloudrain21
источник
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 ...
user3496915
источник
0

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

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

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

Rogoit
источник
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.

Это мой метод, надеюсь, это полезно. :)

DHA
источник
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 file, полученный элементом input, когда мы выберем правильный файл, он даст натуральную высоту и ширину изображения

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;
}
itsCodingThing
источник