Jak uzyskać rozmiar obrazu (wysokość i szerokość) za pomocą JavaScript?

Odpowiedzi:

792

Możesz programowo uzyskać obraz i sprawdzić wymiary za pomocą 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';

Może to być przydatne, jeśli obraz nie jest częścią znaczników.

Josh Stodola
źródło
4
@ blo0p3r - obraz nie musi być wcześniej załadowany do DOM. Ładuje obraz i odpala obciążenie, aby podać nam wymiary. Nawiasem mówiąc - najlepsza odpowiedź tutaj !!
Vik
Chciałbym, abyś mógł to zrobić również za pomocą obiektu XMLHttpRequest.
PHearst
Jak mogę użyć tego kodu do wielu (szeregu) obrazów? Prawdopodobnie musiałby to połączyć z najlepszą odpowiedzią tutaj: stackoverflow.com/questions/4288759/... ?
Kozuch,
Rozwiązanie dla wielu zdjęć tutaj: stackoverflow.com/questions/19269834/…
Kozuch
2
img.onerror = function () {alert (0); // not found handler}
Limitless isa
437

clientWidth i clientHeight są właściwościami DOM, które pokazują bieżący rozmiar wewnętrznych wymiarów elementu DOM w przeglądarce (bez marginesu i ramki). Tak więc w przypadku elementu IMG uzyska on rzeczywiste wymiary widocznego obrazu.

var img = document.getElementById('imageid'); 
//or however you get a handle to the IMG
var width = img.clientWidth;
var height = img.clientHeight;
Rex M.
źródło
33
@Nicky dokładnie w porządku. Podaje wymiary obrazu renderowanego w tym przypadku .
Rex M
8
@ Mat-visual $.fn.widthi $.fn.height.
yckart
202
Prawidłowa odpowiedź to użyć img.naturalWidth i img.naturalHeight
Octopus
5
document.getElementByIdmożna pisać dłużej, ale 10 razy szybciej niż $('#...')[0].
bfontaine,
17
@RexM W Chrome 35 jest 16 razy szybszy: jsperf.com/document-getelementbyid-vs-jquery/5
bfontaine
335

Ponadto (oprócz odpowiedzi Rexa i Iana) są:

imageElement.naturalHeight

i

imageElement.naturalWidth

Zapewniają one wysokość i szerokość samego pliku obrazu (a nie tylko elementu obrazu).

olliej
źródło
15
Jest to teraz obsługiwane w IE9 i we wszystkich nowoczesnych przeglądarkach internetowych.
Aaron
dostać 0x0, gdy obraz nie zakończył ładowania.
brk
1
Używam chrome i działa to tylko wtedy, gdy rozmiar obrazu w domku nie zmienia się po załadowaniu strony.
Jonathan Czitkovics
Tak ... właśnie to robię. A potem, jeśli „szerokość naturalna” lub wysokość powróci jako NaN, powracam do innej metody z poprzedniej odpowiedzi (pobierz obraz ponownie jako nowy Image (), a następnie uzyskaj jego szerokość i wysokość podczas zdarzenia onload. Wolniej, ale w ten sposób będzie działać w starszych przeglądarkach, takich jak IE8.
Randy
na wypadek gdybyś chciał wiedzieć o wsparciu przeglądarki caniuse.com/#feat=img-naturalwidth-naturalheight
ulmer-morozov
109

Jeśli korzystasz z jQuery i żądasz rozmiarów obrazu, musisz poczekać, aż się załadują, bo dostaniesz tylko zera.

$(document).ready(function() {
    $("img").load(function() {
        alert($(this).height());
        alert($(this).width());
    });
});
mrtsherman
źródło
Czy szerokość i wysokość są zawsze dostępne w nośniku ładunku?
Anders Lindén
@ AndersLindén - zobacz atrament dodany przez Akseli do zdarzenia load. Istnieje specjalna sekcja poświęcona obrazom. Techniczna odpowiedź brzmi „nie”, ale w praktyce nigdy nie miałem problemu z naszymi witrynami używającymi tej metody.
mrtsherman
Ale jeśli odpowiedź techniczna brzmi „nie”, jest bezużyteczna? Prawda?
Anders Lindén
Czy można uzyskać atrybuty obrazu przed załadowaniem?
nie ma nein
98

Myślę, że aktualizacja tych odpowiedzi jest przydatna, ponieważ jedna z najlepiej głosowanych odpowiedzi sugeruje użycie clientWidthi clientHeight, które moim zdaniem jest już nieaktualne.

Przeprowadziłem kilka eksperymentów z HTML5, aby zobaczyć, które wartości faktycznie zostaną zwrócone.

Przede wszystkim użyłem programu Dash o nazwie Dash, aby uzyskać przegląd interfejsu API obrazu. Stwierdza, że heighti widthsą renderowaną wysokością / szerokością obrazu oraz że naturalHeighti naturalWidthsą wewnętrzną wysokością / szerokością obrazu (i są tylko HTML5).

Użyłem obrazu pięknego motyla z pliku o wysokości 300 i szerokości 400. I ten Javascript:

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

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

Następnie użyłem tego HTML z wbudowanym CSS dla wysokości i szerokości.

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

Wyniki:

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

/*Actual Rendered size*/    120                  150

Następnie zmieniłem HTML na następujący:

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

tzn. używając atrybutów wysokości i szerokości zamiast stylów wbudowanych

Wyniki:

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

/*Actual Rendered size*/     90                  115

Następnie zmieniłem HTML na następujący:

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

tzn. używając zarówno atrybutów, jak i CSS, aby zobaczyć, które mają pierwszeństwo.

Wyniki:

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

/*Actual Rendered size*/    120                  150
paulo62
źródło
1
Jak myślisz, dlaczego clientHeight jest przestarzały?
Cactux,
64

Za pomocą JQuery robisz to:

var imgWidth = $("#imgIDWhatever").width();
Ian Suttle
źródło
63
A jeśli obraz jeszcze się nie załadował?
James Westgate
11
a jeśli obraz jest własnością tła div? :)
NDM
3
@JamesWestgate Jeśli obraz nie został jeszcze załadowany, nie ma możliwości ustalenia jego rzeczywistego rozmiaru. Możesz jednak spróbować odczytać widthi heightatrybuty imgelementu.
Tim
@Tim Możesz załadować go w tle, a po załadowaniu możesz mieć jego wymiary
Odys
26

Rzecz, o której wszyscy zapomnieli, to fakt, że nie można sprawdzić rozmiaru obrazu przed jego załadowaniem. Gdy autor sprawdzi wszystkie opublikowane metody, prawdopodobnie będzie działać tylko na localhost. Ponieważ można tutaj użyć jQuery, pamiętaj, że zdarzenie „gotowe” jest uruchamiane przed załadowaniem obrazów. $ ('# xxx'). width () i .height () powinny zostać uruchomione w zdarzeniu onload lub późniejszym.

Myśliciel
źródło
9
Opublikuj trochę zaktualizowanego kodu, możesz otrzymać opinię, a nawet otrzymać upragnioną odznakę cofnięcia!
James Westgate,
1
@Thinker, proszę podać rozwiązanie, ponieważ analiza wydaje się poprawna.
a20
5
To nie jest odpowiedź. Tylko komentarz na temat innych odpowiedzi.
jeffdill2
20

Naprawdę możesz to zrobić tylko za pomocą wywołania zwrotnego zdarzenia load, ponieważ rozmiar obrazu nie jest znany, dopóki faktycznie się nie załaduje. Coś w rodzaju kodu poniżej ...

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';
Lee Hesselden
źródło
1
w jquery możesz do tego użyć $ .proxy.
Jochem Van Der Spek
9

Z jQuery library-

Użyj .width()i.height() .

Więcej w szerokości jQuery i wysokości jQuery .

Przykładowy kod

$(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>

Abrar Jahin
źródło
8

ok, myślę, że poprawiłem kod źródłowy, aby umożliwić ładowanie obrazu przed próbą znalezienia jego właściwości, w przeciwnym razie wyświetli się „0 * 0”, ponieważ następna instrukcja zostałaby wywołana przed załadowaniem pliku do przeglądarka. Wymaga 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
źródło
8

Zakładając, że chcemy uzyskać wymiary obrazu <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
  });

Naturalne wymiary

el.naturalWidthi el.naturalHeightzapewni nam naturalne wymiary , wymiary pliku obrazu.

Wymiary układu

el.offsetWidthi el.offsetHeightdostanie wymiary, w których element jest renderowany w dokumencie.

Saneef
źródło
4
Po prostu głosuj na istniejące odpowiedzi, które dostarczają pomocnych treści; nie kopiuj z kilku z nich do nowego; kopiujesz treść.
TylerH
7

Przed użyciem rzeczywistego rozmiaru obrazu należy załadować obraz źródłowy. Jeśli używasz frameworka JQuery, możesz uzyskać rzeczywisty rozmiar obrazu w prosty sposób.

$("ImageID").load(function(){
  console.log($(this).width() + "x" + $(this).height())
})
pod
źródło
7

Ta odpowiedź była dokładnie tym, czego szukałem (w jQuery):

var imageNaturalWidth = $('image-selector').prop('naturalWidth');
var imageNaturalHeight = $('image-selector').prop('naturalHeight');
dev101
źródło
5

Możesz mieć prostą funkcję, jak poniżej ( imageDimensions()), jeśli nie boisz się używać obietnic .

// 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>

Neuroprzekaźnik
źródło
3

Odpowiedź JQuery:

$height = $('#image_id').height();
$width  = $('#image_id').width();
Eli Geske
źródło
3

Pomyślałem, że może to być pomocne dla niektórych użytkowników JavaScript i / lub maszynopisu w 2019 roku.

Stwierdziłem, że, jak sugerują niektórzy, niepoprawne:

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";

To jest poprawne:

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

Wniosek:

Użyj img, a nie thisw onloadfunkcji.

Brian
źródło
Powyższy obrazek ma literówkę, powinien być „nie: Próbowałem to edytować, ale nie mogę, ponieważ:” Edycja musi mieć co najmniej 6 znaków; czy jest coś jeszcze do poprawienia w tym poście? ”W przeciwnym razie bardzo proste rozwiązanie, które działa idealnie!
user2677034
Dzięki @ user2677034 za zauważenie. Nie widziałem tego Będę winić klawiaturę Apple. Żartowałem ... To pewnie moja wina. ; P
Brian
2

Ostatnio miałem ten sam problem z błędem w suwaku Flex. Wysokość pierwszego obrazu została ustawiona na mniejszą wartość ze względu na opóźnienie ładowania. Wypróbowałem następującą metodę rozwiązania tego problemu i udało się.

// 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';

To da ci wysokość w stosunku do ustawionej szerokości zamiast oryginalnej szerokości lub Zera.

muhammed basil
źródło
1

Możesz także użyć:

var image=document.getElementById("imageID");
var width=image.offsetWidth;
var height=image.offsetHeight;
praveenjayapal
źródło
1

Nicky De Maeyer zapytał po zdjęciu tła; Po prostu pobieram go z css i zastępuję „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
źródło
Nigdy nie rozumiałem użycia wyrażenia regularnego do tego, gdy korzystałem z jQuery. Ponieważ jQuery znormalizuje atrybut, dzięki któremu możesz dobrze uciec s.substr(4,s.length-5), co najmniej łatwiej dla oczu;)
Jonas Schubert Erlandsson
1

Można zastosować właściwość modułu obsługi obciążenia, gdy strona ładuje się w js lub jquery w następujący sposób: -

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

 });
Harkamal Singh
źródło
1

Możesz po prostu przetestować w ten sposób.

  <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
źródło
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 ...
użytkownik3496915
źródło
0

ważne jest, aby usunąć ustawienie interpretowane w przeglądarce z nadrzędnego div. Więc jeśli chcesz rzeczywistą szerokość i wysokość obrazu, możesz po prostu użyć

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

To jeden przykład projektu TYPO3 ode mnie, w którym potrzebuję prawdziwych właściwości obrazu, aby skalować go z odpowiednią relacją.

Rogoit
źródło
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.

To jest moja metoda, mam nadzieję, że będzie pomocna. :)

DHA
źródło
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]);
}

ta praca dla podglądu i przesyłania wielu zdjęć. jeśli musisz wybrać dla każdego z obrazów jeden po drugim. Następnie skopiuj i wklej do wszystkich funkcji podglądu obrazu i zatwierdź !!!

Daniel Adenew
źródło
0

Przed uzyskaniem atrybutów elementu strona dokumentu powinna zostać załadowana:

window.onload=function(){
    console.log(img.offsetWidth,img.offsetHeight);
}
中国 程序员
źródło
0

wystarczy przekazać obiekt pliku img, który jest uzyskiwany przez element wejściowy, gdy wybieramy odpowiedni plik, poda on wysokość i szerokość obrazu

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
źródło