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.


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;

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).


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());
    });
});

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

1
Jak myślisz, dlaczego clientHeight jest przestarzały?
Cactux,

64

Za pomocą JQuery robisz to:

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

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.


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

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>


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']);
}

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.


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())
})

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

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>


3

Odpowiedź JQuery:

$height = $('#image_id').height();
$width  = $('#image_id').width();

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.


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.


1

Możesz także użyć:

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

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()));
}

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;

 });

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>

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

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ą.


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. :)


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ź !!!


0

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

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

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.