69

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
  • 27,734
  • 61
  • 179
  • 311
  • 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

157

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
  • 20,208
  • 12
  • 69
  • 83
  • 29
    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
  • 6
    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
  • 3
    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
43

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
  • 25,849
  • 9
  • 61
  • 72
saeed
  • 3,676
  • 2
  • 23
  • 23
17

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

cheesus
  • 12,185
  • 13
  • 70
  • 134
Vitaly
  • 3,132
  • 24
  • 21
2

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

https://github.com/calipersjs/calipers

Marcus
  • 173
  • 1
  • 1
  • 12
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
  • 7,314
  • 3
  • 48
  • 49
0

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
  • 307
  • 3
  • 11
0

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.