Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Узнать размеры картинки jQuery (https://javascript.ru/forum/misc/31727-uznat-razmery-kartinki-jquery.html)

skillful 18.09.2012 21:23

Узнать размеры картинки jQuery
 
Здравствуйте! Уже несколько дней бьюсь над проблемой получить размеры загруженной картинки во всех браузерах.

Код такой

var href = "картинка.jpg";

var img = new Image();
img.src = href;

var imgWidth = img.width; //длина картинки*/

alert(imgWidth);


imgWidth срабатывает когда уже картинка была загружена ранее, т.е. кэширована браузером.


С помощью функции

Img.onload = function() {
....
}

результатов не дало, перелопатил инет, различные примеры результата не дали. Надеюсь на вашу помощь...

melky 18.09.2012 21:31

Цитата:

Сообщение от skillful
результатов не дало,

пример кода. должно было дать результат.

skillful 20.09.2012 19:55

var href = "картинка.jpg";
var img = new Image();

var imgWidth;
img.onload = function() {	
img.src = href;
alert(this.width + 'x' + this.height); // здесь работает
imgWidth = this.width;
}

alert(imgWidth + 'x'); // здесь не работает

melky 20.09.2012 23:25

img.src = href;

это надо делать не в обработчике события load.

rafonets 20.05.2014 09:09

Хоть и с опозданием на 2 года, но т.к. попал на тему с поисковика, думаю будет актуально и для других, вот рабочий код (у меня):

var href = "картинка.jpg",
     imgWidth,
     img = new Image();

img.onload = function(){
  alert(img.width + 'x' + img.height); // здесь работает
  imgWidth = img.width;
}
img.src = href;

// Здесь не заработает, т.к. переменная imgWidth пустая..., она
//заполнится после загрузки картинки, а алерт сработает сразу.
alert(imgWidth + 'x'); // здесь не работает

// Делаем так:
window.onload = function(){
   alert(imgWidth + 'x'); // здесь работает
   // Вызывается после полной загрузки страницы.
   // (картинки, css, js, html и прочего) все-все...
}

melky 20.05.2014 12:12

Цитата:

Сообщение от rafonets (Сообщение 312606)
Хоть и с опозданием на 2 года, но т.к. попал на тему с поисковика, думаю будет актуально и для других, вот рабочий код (у меня):

var href = "картинка.jpg",
     imgWidth,
     img = new Image();

img.onload = function(){
  alert(img.width + 'x' + img.height); // здесь работает
  imgWidth = img.width;
}
img.src = href;

// Здесь не заработает, т.к. переменная imgWidth пустая..., она
//заполнится после загрузки картинки, а алерт сработает сразу.
alert(imgWidth + 'x'); // здесь не работает

// Делаем так:
window.onload = function(){
   alert(imgWidth + 'x'); // здесь работает
   // Вызывается после полной загрузки страницы.
   // (картинки, css, js, html и прочего) все-все...
}

Прошло 2 года, а рабочий нормальный код теперь такой :

(function (global, name, def) {
  if (typeof (define) == 'function' && define['amd']) define(name, def);
   else global[name] = def();
}) (this, 'loadImage', function () {
  return function (imageSrc, done) {
    var q = new Promise(function (res, rej) {
      var img = new Image();
      img.src = imageSrc;
      img.onerror = function (e) {
        rej(e);
      };
      img.onload = function (e) {
        res(img);
      };
      if (img.complete) res(img);
    });
    return q;
  }
});

loadImage('http://upload.wikimedia.org/wikipedia/ru/8/8d/ImageComicsLogo.gif').then(function (img) {
  alert('Картинка: ' + img);
}, function (e) {
  alert('Ошибка при загрузке картинки: ' + e);
});

рони 20.05.2014 12:17

;) на всякий случай http://caniuse.com/#search=Promise

melky 20.05.2014 13:39

Цитата:

Сообщение от рони (Сообщение 312616)
;) на всякий случай http://caniuse.com/#search=Promise

Тут нет проблемы подключить полифил
https://github.com/jakearchibald/es6-promise
:dance:

жаль, что с flexbox так просто нельзя обойтись

psfdek 14.09.2015 12:26

Мне кажется что так само просто. Чем некоторый огород что тут нагородили :)
function imgSize(href){
        var img = new Image();
        img.src = href;
        
        img.onload = function() {
            return img;
        };
        return img;
    }
        var imgZz = imgSize('http://javascript.ru/forum/images/ca_serenity/misc/logo.gif');
        alert('ширина: '+imgZz.width+';');
        alert('Высота: '+imgZz.height+';');

ruslan_mart 14.09.2015 13:38

psfdek, и что это? onload асинхронно выполняется.

skillful 02.10.2015 22:32

Я автор данной темы. Создал ее еще 3 года назад.

psfdek, тот код который Вы предложили будет работать только если картинка уже отображалась ранее в браузере, т.е. была кэширована.
Об этом кстати я и написал в первом сообщении 3 года назад.
Правильно будет так:

var href = "http://upload.wikimedia.org/wikipedia/ru/8/8d/ImageComicsLogo.gif";
var img = new Image();
img.onload = function()
{
    var intImageWidth = this.width;
    var intImageHeight = this.height;

    alert(intImageWidth + "px; " + intImageHeight + "px;");
}
img.src = href;

just_do_it 10.08.2016 01:03

Подскажите почему так происходит
function imgSize(href){
		        var img = new Image();
		        img.src = href;
		        
		        img.onload = function() {
		            return img;
		        };
		        return img;
		    }

		    y=URL.createObjectURL(files[index]);
		    var imgZz = imgSize(y);

		    alert();
		    console.log(imgZz.width);
		    console.log(imgZz.height);


Если из кода убрать - alert();, тогда размеры не выводяться. НО! если поставить alert();, тогда размеры выводятся как положено и их можно передавать дальше.
У меня проблема в том что размеру нужны для дальнейшей работы с изображением, а не просто для их вывода. А выводить alert(); после каждого изображение не есть выход.
может есть какой-то аналог alert(); или событие которое должно произойти, после чего я смогу получить размеры

Подскажите пжлста

рони 10.08.2016 01:22

just_do_it,
в 6 строке вы получите размер. алерт нужен чтоб вы дождались ответа сервера. мыслить асинхронно.

just_do_it 10.08.2016 01:32

Цитата:

Сообщение от рони (Сообщение 424865)
just_do_it,
в 6 строке вы получите размер. алерт нужен чтоб вы дождались ответа сервера. мыслить асинхронно.

спасибо,
но как мне добиться получения размеров в 15 и 16 строках без алерта?:thanks:

warren buffet 10.08.2016 07:30

Размер ты получишь не раньше, чем загрузится картинка. Следовательно только когда она загрузится, можно получить размер. Иными словами когда картинка загрузится, ты получишь размер, то есть не раньше чем она загрузится, ибо до этого момента измерять нечего. Дошло?

img.onload = function(){
    console.log(this.width);
    console.log(this.height);
};

just_do_it 10.08.2016 11:21

warren buffet, все теперь понял)), спс


Часовой пояс GMT +3, время: 13:07.