Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Cropping images with nodejs streams and imagemagick
var spawn = require('child_process').spawn;
var Stream = require('stream');
* crops and resizes images to our desired size
* @param {Stream} streamIn in stream containing the raw image
* @return {Stream}
exports.cropImage = function(streamIn){
var command = 'convert';
var args = [
"-", // use stdin
"-resize", "640x", // resize width to 640
"-resize", "x360<", // resize height if it's smaller than 360
"-gravity", "center", // sets the offset to the center
"-crop", "640x360+0+0", // crop
"+repage", // reset the virtual canvas meta-data from the images.
"-" // output to stdout
var proc = spawn(command, args);
var stream = new Stream();
proc.stderr.on('data', stream.emit.bind(stream, 'error'));
proc.stdout.on('data', stream.emit.bind(stream, 'data'));
proc.stdout.on('end', stream.emit.bind(stream, 'end'));
proc.on('error', stream.emit.bind(stream, 'error'));
return stream;
// usage
var fs = require('fs');
var streamIn = fs.createReadStream('./image.jpg');
var streamOut = fs.createWriteStream('./resized.jpg');
Copy link

AndreasFurster commented Jan 3, 2019

Doesn't one of the data events on line 28 or 29 need to be error?
And yes, 7 years later, your gist is still very useful! 🥇

Copy link

pyratin commented Jan 7, 2019

@AndreasFurster same here :D

Copy link

BrunildaNinox commented Apr 17, 2019

Do you know how to handle the output format of the image? -format and -define do not work.
It outputs the same format it receives.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment