Come ottenere le dimensioni dell'immagine (altezza e larghezza) utilizzando JavaScript?


Risposte:


792

È possibile ottenere a livello di codice l'immagine e controllare le dimensioni utilizzando 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';

Questo può essere utile se l'immagine non fa parte del markup.


4
@ blo0p3r - l'immagine non deve essere caricata nel DOM prima di questo. Carica l'immagine e genera l'onload per darci le dimensioni. A proposito: la migliore risposta qui !!
Vik

Vorrei che potessi farlo anche con un oggetto XMLHttpRequest.
PHearst

Come posso usare questo codice per più (una matrice di) immagini? Probabilmente avrebbe bisogno di combinarlo con la migliore risposta da qui: stackoverflow.com/questions/4288759/… ?
Kozuch,

Soluzione per più immagini qui: stackoverflow.com/questions/19269834/…
Kozuch

2
img.onerror = function () {alert (0); // gestore non trovato}
Limitless isa

437

clientWidth e clientHeight sono proprietà DOM che mostrano le dimensioni correnti nel browser delle dimensioni interne di un elemento DOM (esclusi margine e bordo). Quindi, nel caso di un elemento IMG, questo otterrà le dimensioni effettive dell'immagine visibile.

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

33
@ Nicky esattamente. Fornisce le dimensioni dell'immagine così come viene visualizzata in quell'istanza .
Rex M

8
@ Mat-visual $.fn.widthe $.fn.height.
yckart

202
La risposta corretta è usare img.naturalWidth e img.naturalHeight
Octopus

5
document.getElementByIdè più lungo da scrivere ma 10 volte più veloce di $('#...')[0].
bfontaine,

17
@RexM Su Chrome 35, è 16 volte più veloce: jsperf.com/document-getelementbyid-vs-jquery/5
bfontaine

335

Inoltre (oltre alle risposte di Rex e Ian) c'è:

imageElement.naturalHeight

e

imageElement.naturalWidth

Questi forniscono l'altezza e la larghezza del file immagine stesso (piuttosto che solo l'elemento immagine).


15
Questo è ora supportato in IE9 e in tutti i browser Web moderni.
Aaron,

ottiene 0x0 quando l'immagine non ha terminato il suo caricamento.
Brk

1
Sto usando Chrome e questo funziona solo se la dimensione dell'immagine nel dom non cambia una volta caricata la pagina.
Jonathan Czitkovics,

Sì ... questo è quello che faccio. E poi, se "naturalwidth" o height tornano come NaNs, torno all'altro metodo dalla risposta precedente (ottieni di nuovo l'immagine come una nuova Image (), e poi ottengo la sua larghezza e altezza durante l'evento onload. Più lento, ma in questo modo funzionerà nei browser più vecchi come IE8.
Randy

nel caso in cui desideri conoscere il supporto del browser caniuse.com/#feat=img-naturalwidth-naturalheight
ulmer-morozov

109

Se si utilizza jQuery e si richiedono dimensioni delle immagini, è necessario attendere fino al loro caricamento o si otterranno solo zero.

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

La larghezza e l'altezza sono sempre disponibili nel gestore del carico?
Anders Lindén,

@ AndersLindén: vedi l'inchiostro aggiunto da Akseli per l'evento load. C'è una sezione specifica dedicata alle immagini. La risposta tecnica è "no", ma in pratica non ho mai avuto problemi con i nostri siti che utilizzano questo metodo.
sig

Ma se la risposta tecnica è no, è inutilizzabile? Non è vero?
Anders Lindén,

È possibile ottenere gli attributi dell'immagine prima che si carichi?
no nein

98

Penso che un aggiornamento a queste risposte sia utile perché una delle risposte più votate suggerisce l'utilizzo di clientWidthclientHeight, che ora ritengo obsoleto.

Ho fatto alcuni esperimenti con HTML5, per vedere quali valori vengono effettivamente restituiti.

Prima di tutto, ho usato un programma chiamato Dash per avere una panoramica dell'API delle immagini. Indica che heighte widthsono l'altezza / larghezza di rendering dell'immagine e che naturalHeighte naturalWidthsono l'altezza / larghezza intrinseca dell'immagine (e sono solo HTML5).

Ho usato l'immagine di una bellissima farfalla, da un file con altezza 300 e larghezza 400. E questo Javascript:

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

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

Quindi ho usato questo HTML, con CSS incorporato per l'altezza e la larghezza.

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

risultati:

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

/*Actual Rendered size*/    120                  150

Ho quindi modificato il codice HTML nel modo seguente:

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

cioè usando attributi di altezza e larghezza piuttosto che stili incorporati

risultati:

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

/*Actual Rendered size*/     90                  115

Ho quindi modificato il codice HTML nel modo seguente:

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

cioè usando sia gli attributi che i CSS, per vedere quale ha la precedenza.

risultati:

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

/*Actual Rendered size*/    120                  150

1
Perché pensi che clientHeight sia obsoleto?
Cactux,

64

Usando JQuery fai questo:

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

63
E se l'immagine non è ancora stata caricata?
James Westgate,

11
e se l'immagine è nella proprietà di sfondo del div? :)
NDM

3
@JamesWestgate Se l'immagine non è stata ancora caricata, non è possibile determinarne le dimensioni effettive. Puoi comunque tentare di leggere gli attributi widthe dell'elemento. heightimg
Tim

@Tim Puoi caricarlo in background e quando è caricato puoi avere le sue dimensioni
Odys

26

La cosa che tutti gli altri hanno dimenticato è che non puoi controllare la dimensione dell'immagine prima che si carichi. Quando l'autore controlla tutti i metodi pubblicati, probabilmente funzionerà solo su localhost. Dato che jQuery può essere usato qui, ricorda che l'evento 'ready' viene generato prima che le immagini vengano caricate. $ ('# xxx'). width () e .height () devono essere attivati ​​nell'evento onload o successivo.


9
Pubblica un po 'di codice aggiornato, potresti essere votato e persino ottenere un distintivo inversione desiderato!
James Westgate,

1
@Thinker, i pls forniscono la tua soluzione perché la tua analisi sembra corretta.
a20,

5
Questa non è una risposta Solo un commento sulle altre risposte.
jeffdill2,

20

Puoi farlo solo usando un callback dell'evento load in quanto la dimensione dell'immagine non è nota fino a quando non ha terminato il caricamento. Qualcosa come il codice qui sotto ...

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
in jquery, puoi usare $ .proxy per questo.
Jochem Van Der Spek,

9

Con la libreria jQuery-

Usa .width()e .height().

Altro in larghezza jQuery e altezza jQuery .

Codice di esempio

$(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 ragazzi, penso di aver migliorato il codice sorgente per essere in grado di caricare l'immagine prima di provare a scoprirne le proprietà, altrimenti visualizzerà '0 * 0', perché la prossima istruzione sarebbe stata chiamata prima che il file fosse caricato in il browser. Richiede 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

Supponendo, vogliamo ottenere dimensioni dell'immagine di <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
  });

Dimensioni naturali

el.naturalWidthe ci el.naturalHeightdarà le dimensioni naturali , le dimensioni del file immagine.

Dimensioni del layout

el.offsetWidthe ci el.offsetHeightfornirà le dimensioni in base alle quali viene eseguito il rendering dell'elemento sul documento.


4
Basta votare le risposte esistenti che forniscono contenuti utili; non copiare da molti di essi in uno nuovo; stai solo duplicando i contenuti allora.
TylerH,

7

Prima di utilizzare le dimensioni reali dell'immagine, è necessario caricare l'immagine di origine. Se usi il framework JQuery puoi ottenere dimensioni reali dell'immagine in modo semplice.

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

7

Questa risposta era esattamente quello che stavo cercando (in jQuery):

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

5

Puoi avere una semplice funzione come la seguente ( imageDimensions()) se non temi di usare le promesse .

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

Risposta di JQuery:

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

3

Ho pensato che questo potrebbe essere utile per alcuni che stanno usando Javascript e / o Typescript nel 2019.

Ho trovato quanto segue, come alcuni hanno suggerito, per essere errato:

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

Questo è corretto:

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

Conclusione:

Utilizzare img, non this, in onloadfunzione.


img.src sopra ha un refuso, dovrebbe essere "no: ho provato a modificarlo ma non posso perché:" Le modifiche devono essere di almeno 6 caratteri; c'è qualcos'altro da migliorare in questo post? "Altrimenti una soluzione molto semplice che funziona perfettamente!
user2677034

Grazie @ user2677034 per avermelo notato. Non l'ho visto. Darò la colpa alla tastiera di Apple. Sto solo scherzando ... Probabilmente è stata colpa mia. ; P
Brian

2

Recentemente ho avuto lo stesso problema per un errore nel dispositivo di scorrimento flessibile. L'altezza della prima immagine è stata ridotta a causa del ritardo di caricamento. Ho provato il seguente metodo per risolvere il problema ed ha funzionato.

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

Questo ti darà l'altezza rispetto alla larghezza impostata piuttosto che alla larghezza originale o Zero.


1

Puoi anche usare:

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

1

Nicky De Maeyer ha chiesto una foto di sfondo; Lo prendo semplicemente dal CSS e sostituisco "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()));
}

Non ho mai capito l'uso di regexp per questo quando ho usato jQuery. Poiché jQuery normalizzerà l'attributo per te che ti allontani bene usando s.substr(4,s.length-5), è almeno più facile per gli occhi;)
Jonas Schubert Erlandsson,

1

È possibile applicare la proprietà del gestore onload quando la pagina viene caricata in js o jquery in questo modo: -

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

 });

1

Semplicemente, puoi provare in questo modo.

  <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

è importante rimuovere l'impostazione interpretata dal browser dal div principale. Quindi, se vuoi la larghezza e l'altezza dell'immagine reali, puoi semplicemente usare

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

Questo è un mio esempio del Progetto TYPO3 in cui ho bisogno delle proprietà reali dell'immagine per ridimensionarlo con la giusta relazione.


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.

Questo è il mio metodo, spero che sia utile. :)


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

questo lavoro per l'anteprima e il caricamento di più immagini. se devi selezionare per ciascuna delle immagini una per una. Quindi copia e incolla in tutte le funzioni di anteprima dell'immagine e convalida !!!


0

Prima di acquisire gli attributi dell'elemento, la pagina del documento deve essere caricata:

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

0

basta passare l'oggetto file img che si ottiene dall'elemento input quando selezioniamo il file corretto che fornirà l'altezza e la larghezza netural dell'immagine

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.