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.
-
1This 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 Answers
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);
});
- 20,208
- 12
- 69
- 83
-
29This 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
-
6There 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
-
3Not 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
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);
}
});
- 25,849
- 9
- 61
- 72
- 3,676
- 2
- 23
- 23
-
In this case, how can I write a function that returns `size.width` for a given image, and invoke that function outside of the callback? – Anderson Green Sep 22 '12 at 02:56
-
2Also, here's a related question: http://stackoverflow.com/questions/12540405/how-can-i-specify-the-order-in-which-node-js-functions-are-evaluated – Anderson Green Sep 22 '12 at 03:22
-
-
Is there a way to do this without using an image library in pure JS? – Jasdeep Khalsa Jun 24 '13 at 09:47
-
3This is a great example of why you should always use curly brackets, only the first `console.log` is covered by the `if` statement. – Linus Unnebäck Nov 14 '13 at 15:43
-
1
-
Oliver, the link in the answer below this one shows an example of getting the dimensions of a remote URL. – Gavin Jun 23 '14 at 16:58
-
can anyone tell us how to get the remote URL image size please ? with 'https://' ?? – Sahan Jan 22 '16 at 04:34
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).
Calipers is another pure Javascript library that can determine the dimensions of images.
- 173
- 1
- 1
- 12
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){
}
});
- 7,314
- 3
- 48
- 49
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
- 307
- 3
- 11
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.
- 129
- 8