84

Is it possible to get the width and height of an image in node.js (on the server side, not the client side)? I need to find the width and height of an image in a node.js library that I'm writing.

Anderson Green
  • 30,230
  • 67
  • 195
  • 328
  • 1
    This appears to be a duplicate (and someone found an answer already): http://stackoverflow.com/questions/5530946/opening-images-on-nodejs-and-finding-out-width-height – Anderson Green Sep 22 '12 at 02:09

7 Answers7

174

Installing GraphicsMagick or ImageMagick isn't at all needed, determining the dimensions of a image is as easy as looking at the header. image-size is a pure javascript implementation of said feature which is very easy to use.

https://github.com/netroy/image-size

var sizeOf = require('image-size');
sizeOf('images/funny-cats.png', function (err, dimensions) {
  console.log(dimensions.width, dimensions.height);
});
Linus Unnebäck
  • 23,234
  • 15
  • 74
  • 89
  • 31
    This should be the accepted answer simply because gm/im have much more overhead than needed for this task. – theflowersoftime Jun 18 '14 at 18:40
  • 7
    There is a [bug in image-size](https://github.com/netroy/image-size/issues/37). I just experienced it in production. GraphicsMagick does not have the same bug. – paldepind Sep 16 '15 at 07:50
  • 4
    Not at all. image-size gives "Corrupt JPG, exceeded buffer limits" error on big jpg files – Gatunox Aug 10 '18 at 01:19
  • This is indeed a very good solution. And for those who require only a tiny bit of the logic for a specific format, for example, the library is very easy to extract and reduce. – Andry Oct 21 '21 at 11:19
  • If you are trying to use this in a context which doesn't allow `fs` or `path` imports, try using the `buffer-image-size` library instead ([from this answer](https://stackoverflow.com/a/71922563/2738164)). It explicitly forks `image-size` and removes those two dependencies. Very helpful for usage in Next.js static contexts. – bsplosion May 18 '23 at 16:09
45

Yes this is possible but you will need to install GraphicsMagick or ImageMagick.

I have used both and I can recommend GraphicsMagick it's lot faster.

Once you have installed both the program and it's module you would do something like this to get the width and height.

gm = require('gm');

// obtain the size of an image
gm('test.jpg')
.size(function (err, size) {
  if (!err) {
    console.log('width = ' + size.width);
    console.log('height = ' + size.height);
  }
});
Akseli Palén
  • 27,244
  • 10
  • 65
  • 75
saeed
  • 3,861
  • 3
  • 25
  • 23
22

https://github.com/nodeca/probe-image-size

More interesting problem is "how to detect image size without full file download from remote server". probe-image-size will help. Of course, it supports local streams too.

It's written in pure JS and does not need any heavy dependencies (ImageMagick and so on).

Jonas Sourlier
  • 13,684
  • 16
  • 77
  • 148
Vitaly
  • 3,340
  • 26
  • 21
4

Easiest way to do this with multer using buffer-image-size

I have used buffer-image-size to validate the image dimensions. I need to validate the exact image size before uploading it to the bucket.

var sizeOf = require('buffer-image-size');
var dimensions = sizeOf(yourImageBuffer);
console.log(dimensions.width, dimensions.height);

ex:

Router.js

Router.post('/upload_image',
         multerUpload.single('image'),     // multer upload configuration
         imageDimensionHandler(500,200),   // here I validate image dimension
         upload_image_controller           // controller function
       );

here is my middleware that I used after multerUpload.single('image') middleware.

imageDimensionHandler.js ( middleware )

const sizeOf = require('buffer-image-size');

const imageDimensionHandler = (width, height) => (async (req, res, next) => {
    if (req.file) {
        const fileBuffer = req.file.buffer;
        var dimensions = sizeOf(fileBuffer);

        if (width == dimensions.width && height == dimensions.height) {
            next();
        } else {
            throw new Error(`expected image size is ${condition.width} x ${condition.height} pixel.`);
        }
    } else {
        next();
    }
});

Note: please ignore it if you don't find it appropriate for you.

2

Calipers is another pure Javascript library that can determine the dimensions of images.

https://github.com/calipersjs/calipers

Marcus
  • 172
  • 1
  • 1
  • 13
1

I used Jimp: https://www.npmjs.com/package/jimp npm install --save jimp

const jimage1 = await Jimp.read(imgBuffer);
const jimage2 = await Jimp.read(imgUrl);
const width = jimage1.bitmap.width;

It's effectively a wrapper for pixel-match

Blaze Gawlik
  • 337
  • 3
  • 11
0
var sizeOf = require('image-size');
    sizeOf(my_file_item.completeFilename, function (err, dimensions) {
        try{
          if(!err){
            let image_dimensions = dimensions || "";
            let width = 200; // we want 200 
            let height = parseInt(width/(image_dimensions.width/image_dimensions.height));


          }else{

          }
          // console.log(ex);
        }catch(ex){

        }
      });
VIKAS KOHLI
  • 8,164
  • 4
  • 50
  • 61