725

Is there a JavaScript or jQuery API or method to get the dimensions of an image on the page?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Saneef
  • 8,620
  • 7
  • 29
  • 42
  • 18
    It's easy with modern browsers: http://davidwalsh.name/get-image-dimensions – Yarin Jan 09 '15 at 05:08
  • 5
    Most of the answers below just get the style width and height, not the actual image's width and height. Use `imgElement.naturalWidth` and `imgElement.naturalHeight` for getting width and height. – Bamdad Dec 29 '20 at 08:09
  • Regardless of whether you want to use Javascript or jQuery **it is essential that the image is visible in the browser**. In practice, neither the image nor the parent elements must have the rule `display:none;`. – Vincenzo Di Gaetano Sep 04 '22 at 09:31

33 Answers33

905

You can programmatically get the image and check the dimensions using JavaScript...

const img = new Image();
img.onload = function() {
  alert(this.width + 'x' + this.height);
}
img.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';

This can be useful if the image is not a part of the markup.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Josh Stodola
  • 81,538
  • 47
  • 180
  • 227
469

clientWidth and clientHeight are DOM properties that show the current in-browser size of the inner dimensions of a DOM element (excluding margin and border). So in the case of an IMG element, this will get the actual dimensions of the visible image.

var img = document.getElementById('imageid'); 
//or however you get a handle to the IMG
var width = img.clientWidth;
var height = img.clientHeight;
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
Rex M
  • 142,167
  • 33
  • 283
  • 313
459

Also (in addition to Rex and Ian's answers) there is:

imageElement.naturalHeight

and

imageElement.naturalWidth

These provide the height and width of the image file itself (rather than just the image element).

MultiplyByZer0
  • 6,302
  • 3
  • 32
  • 48
olliej
  • 35,755
  • 9
  • 58
  • 55
  • Thank you. I was having an issue getting the width and height of some images before inserting them into the database. For some reason, the image would be 0x0. Adding this in place of "clientWidth" and "clientHeight" I was able to get rid of the bug. (I hope). Will have to wait and see what happens in the future, as I thought the other way was working as well when it started sticking 0x0. This does as well, but once the page is refreshed it inserts the correct dimensions. Thank you. – Wayne Barron Jun 20 '23 at 03:57
113

If you are using jQuery and you are requesting image sizes you have to wait until they load or you will only get zeroes.

$(document).ready(function() {
    $("img").load(function() {
        alert($(this).height());
        alert($(this).width());
    });
});
mrtsherman
  • 39,342
  • 23
  • 87
  • 111
104

Using clientWidth and clientHeight is, I think, now obsolete.

I have done some experiments with HTML5, to see which values actually get returned.

First of all, I used a program called Dash to get an overview of the image API.

It states that height and width are the rendered height/width of the image and that naturalHeight and naturalWidth are the intrinsic height/width of the image (and are HTML5 only).

I used an image of a beautiful butterfly, from a file with height 300 and width 400. And this JavaScript code:

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

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

Then I used this HTML, with inline CSS for the height and width.

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

Results:

/* Image element */ height == 300         width == 400
             naturalHeight == 300  naturalWidth == 400
/* jQuery */      height() == 120       width() == 150

/* Actual rendered size */    120                  150

I then changed the HTML to the following:

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

I.e., using height and width attributes rather than inline styles.

Results:

/* Image element */ height ==  90         width == 115
             naturalHeight == 300  naturalWidth == 400
/* jQuery */      height() ==  90       width() == 115

/* Actual rendered size */     90                  115

I then changed the HTML to the following:

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

I.e., using both attributes and CSS, to see which takes precedence.

Results:

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

/* Actual rendered size */    120                  150
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
paulo62
  • 2,637
  • 1
  • 21
  • 15
  • 1
    "*which I think is now obsolete*" What do you mean? Do you mean deprecated? Or removed? And do you _know? "I think" is not very reassuring if I am going to depend on an answer. – TylerH Apr 27 '22 at 14:22
65

Using jQuery, you do this:

var imgWidth = $("#imgIDWhatever").width();
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ian Suttle
  • 3,384
  • 2
  • 23
  • 27
27

The thing all other have forgot is that you can’t check image size before it loads. When the author checks all of posted methods it will work probably only on localhost.

Since jQuery could be used here, remember that the 'ready' event is fired before images are loaded. $('#xxx').width() and .height() should be fired in the onload event or later.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Thinker
  • 14,234
  • 9
  • 40
  • 55
20

You can only really do this using a callback of the load event as the size of the image is not known until it has actually finished loading. Something like the code below...

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
  • 784
  • 5
  • 11
19

Let's combine everything we learned here into one simple function (imageDimensions()). It uses promises.

// helper to get dimensions of an image
const imageDimensions = file => 
    new Promise((resolve, reject) => {
        const img = new Image()

        // the following handler will fire after a successful loading 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>
Neurotransmitter
  • 6,289
  • 2
  • 51
  • 38
  • thanks for this code, but it returns 0 for width and height in firefox for SVG images without defined width and height attributes (eg, ones with only viewBox set). – Crashalot Aug 29 '20 at 08:16
  • @Crashalot right, this is not for vector images, this works only for raster ones. – Neurotransmitter Aug 30 '20 at 10:07
11

To get the natural height and width:

document.querySelector("img").naturalHeight;
document.querySelector("img").naturalWidth;
<img src="img.png">

And if you want to get style height and width:

document.querySelector("img").offsetHeight;
document.querySelector("img").offsetWidth;
sundeep sharma
  • 118
  • 4
  • 11
9

Assuming, we want to get image dimensions of <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
  });
})

Natural Dimensions

el.naturalWidth and el.naturalHeight will get us the natural dimensions, the dimensions of the image file.

Layout Dimensions

el.offsetWidth and el.offsetHeight will get us the dimensions at which the element is rendered on the document.

Saneef
  • 8,620
  • 7
  • 29
  • 42
8

I think I improved the source code to be able to let the image load before trying to find out its properties. Otherwise, it will display '0 * 0', because the next statement would have been called before the file was loaded into the browser. It requires 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']);
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
claudio
  • 81
  • 1
  • 1
8

This answer was exactly what I was looking for (in jQuery):

var imageNaturalWidth = $('image-selector').prop('naturalWidth');
var imageNaturalHeight = $('image-selector').prop('naturalHeight');
Community
  • 1
  • 1
dev101
  • 1,359
  • 2
  • 18
  • 32
8

I thought this might be helpful to some who are using JavaScript and/or TypeScript in 2019.

I found the following, as some have suggested, to be incorrect:

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

This is correct:

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

Conclusion:

Use img, not this, in the onload function.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Brian
  • 316
  • 3
  • 5
  • img.src above has a typo, should be " not : I tried to edit this but can't because: "Edits must be at least 6 characters; is there something else to improve in this post?" Otherwise a very simple solution that works perfectly! – user2677034 Apr 03 '20 at 04:51
  • Thanks @user2677034 for noticing. I didn't see that. I'll blame Apple's keyboard. Just kidding... It was probably my fault. ;P – Brian Apr 11 '20 at 16:07
6

Before using the real image size, you should load the source image. If you use the jQuery framework, you can get the real image size in a simple way.

$("ImageID").load(function(){
  console.log($(this).width() + "x" + $(this).height())
})
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
sub
  • 69
  • 1
  • 2
6

With the jQuery library-

Use .width() and .height().

More in jQuery width and jQuery heigth.

Example Code-

$(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>
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Abrar Jahin
  • 13,970
  • 24
  • 112
  • 161
3

A jQuery answer:

$height = $('#image_id').height();
$width  = $('#image_id').width();
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Eli Geske
  • 65
  • 1
2

Recently I had the same issue for an error in the flex slider. The first image's height was set smaller due to the loading delay. I tried the following method for resolving that issue and it's worked.

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

This will give you the height with respect to the width you set rather than original width or Zero.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Muhammed Basil
  • 1,834
  • 1
  • 21
  • 39
2

My two cents in jQuery

Disclaimer: This does not necessarily answer this question, but broadens our capabilities. It was tested and working in jQuery 3.3.1

Let’s consider:

  1. You have the image URL/path and you want to get the image width and height without rendering it on the DOM,

  2. Before rendering image on the DOM, you need to set the offsetParent node or image div wrapper element to the image width and height, to create a fluid wrapper for different image sizes, i.e., when clicking a button to view image on a modal/lightbox

This is how I will do it:

// image path
const imageUrl = '/path/to/your/image.jpg'

// Create dummy image to get real width and height
$('<img alt="" src="">').attr("src", imageUrl).on('load', function(){
    const realWidth = this.width;
    const realHeight = this.height;
    alert(`Original width: ${realWidth}, Original height: ${realHeight}`);
})
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ngatia Frankline
  • 2,897
  • 2
  • 20
  • 19
1

Nicky De Maeyer asked for a background picture; I simply get it from the CSS content and replace the "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()));
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Hraban
  • 545
  • 5
  • 10
1

You can apply the onload handler property when the page loads in JavaScript or jQuery like this:

$(document).ready(function(){
   var width = img.clientWidth;
   var height = img.clientHeight;
 });
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
1

This is an alternative answer for Node.js. That isn't likely what the OP meant, but it could come in handy and seems to be in the scope of the question.

This is a solution with Node.js, and the example uses the Next.js framework, but it would work with any Node.js framework. It uses the probe-image-size NPM package to resolve the image attributes from the server side.

Example use case: I used the below code to resolve the size of an image from an Airtable Automation script, which calls my own analyzeImage API and returns the image's props.

import {
  NextApiRequest,
  NextApiResponse,
} from 'next';
import probe from 'probe-image-size';

export const analyzeImage = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {
  try {
    const result = await probe('http://www.google.com/intl/en_ALL/images/logo.gif');

    res.json(result);
  } catch (e) {
    res.json({
      error: true,
      message: process.env.NODE_ENV === 'production' ? undefined : e.message,
    });
  }
};

export default analyzeImage;

Yields:

{
"width": 276,
"height": 110,
"type": "gif",
"mime": "image/gif",
"wUnits": "px",
"hUnits": "px",
"length": 8558,
"url": "http://www.google.com/intl/en_ALL/images/logo.gif"
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Vadorequest
  • 16,593
  • 24
  • 118
  • 215
1

In my case, I have a File type (that is guaranteed to be an image), and I want the image dimensions without loading it on the DOM.

General strategy: Convert File to ArrayBuffer → Convert ArrayBuffer to a base64 string → use this as the image source with an Image class → use naturalHeight & naturalWidth to get dimensions.

const fr = new FileReader();
fr.readAsArrayBuffer(image); // Image the 'File' object
fr.onload = () => {
  const arrayBuffer: ArrayBuffer = fr.result as ArrayBuffer;

  // Convert to base64. String.fromCharCode can hit a stack overflow error if you pass
  // the entire arrayBuffer in, and iteration gets around this
  let binary = '';
  const bytes = new Uint8Array(arrayBuffer);
  bytes.forEach(b => binary += String.fromCharCode(b));
  const base64Data = window.btoa(binary);

  // Create an image object. Note, a default width/height MUST be given to the constructor (per
  // the documentation) or naturalWidth/Height will always return 0.
  const imageObj = new Image(100, 100);
  imageObj.src = `data:${image.type};base64,${base64Data}`;
  imageObj.onload = () => {
    console.log(imageObj.naturalWidth, imageObj.naturalHeight);
  }
}

This allows you to get the image dimensions and aspect ratio all from a File without rendering it. It can easily convert the onload functions to RxJS Observables using fromEvent for a better async experience:

// fr is the file reader, and this is the same as fr.onload = () => { ... }
fromEvent(fr, 'load')
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Avery Ferrante
  • 132
  • 1
  • 6
0

It is important to remove the browser interpreted setting from the parent div. So if you want the real image width and height, you can just use

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

This is one TYPO3 project example from me where I need the real properties of the image to scale it with the right relation.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Rogoit
  • 81
  • 7
0

Use

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 resolution image. Your image width=" + this.width + ", height=" + 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]);
}

This works for multiple images preview and upload. If you have to select for each of the images one by one, then copy and paste into all the preview image function and validate!!!

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Develop4Life
  • 7,581
  • 8
  • 58
  • 76
  • This seems like a completely bogus answer. Is it? For instance, function `outmeInside` is not used anywhere and the code is unbalanced. – Peter Mortensen Feb 01 '23 at 00:43
0

Simply, you can test like this.

  <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
  • 649
  • 5
  • 17
0

Just pass the 'img' file object which is obtained by the input element. When we select the correct file, it will give the netural height and width of the image.

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;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
itsCodingThing
  • 321
  • 3
  • 4
0
const file = event.target.files[0];
const img = new Image();
img.onload = function () {
  width = img.width;
  height = img.height;
};
img.src = URL.createObjectURL(file);
alert(width + "x" + height);
Alouani Younes
  • 948
  • 9
  • 17
-1

This is my method:

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.
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
DHA
  • 17
  • 2
-1

Before acquiring an element's attributes, the document page should be onload:

window.onload = function(){
    console.log(img.offsetWidth,img.offsetHeight);
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
-1

You can also use:

var image=document.getElementById("imageID");
var width=image.offsetWidth;
var height=image.offsetHeight;
sth
  • 222,467
  • 53
  • 283
  • 367
praveenjayapal
  • 37,683
  • 30
  • 72
  • 72
-2
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 ...
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
-4

Try

function sizes() {
  console.log(`width: ${pic.width}, height:${pic.height}`);
}
<img id="pic" src="https://picsum.photos/300/150">
<button onclick="sizes()">show size</button>
Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345