Improved API, added first performance test

This commit is contained in:
Lovell Fuller 2013-08-20 23:55:03 +01:00
parent a4149ed2a5
commit 9ba9b95648
8 changed files with 87 additions and 8 deletions

2
.gitignore vendored
View File

@ -11,5 +11,7 @@ pids
logs
results
build
node_modules
tests/output.jpg
npm-debug.log

View File

@ -2,8 +2,7 @@ language: node_js
node_js:
- "0.11"
- "0.10"
- "0.8"
before_install:
- sudo apt-get update -qq
- sudo apt-get install -qq libvips-dev
- sudo apt-get install -qq libvips-dev imagemagick
- sudo ln -s /usr/lib/pkgconfig/vips-7.26.pc /usr/lib/pkgconfig/vips.pc

View File

@ -1,4 +1,6 @@
# sharp (_adj_)
# sharp
_adj_
1. clearly defined; distinct: a sharp photographic image.
2. quick, brisk, or spirited.
@ -9,7 +11,7 @@ The typical use case for this high performance Node.js module is to convert a la
It is somewhat opinionated in that it only deals with JPEG images, always obeys the requested dimensions by either cropping or embedding and insists on a mild sharpen of the resulting image.
Under the hood you'll find the blazingly fast [libvips](https://github.com/jcupitt/libvips) image processing library, originally created in 1989 at Birkbeck College and currently maintained by the University of Southampton.
Under the hood you'll find the blazingly fast [libvips](https://github.com/jcupitt/libvips) image processing library, originally created in 1989 at Birkbeck College and currently maintained by the University of Southampton. Speed is typically 25-30% faster than the imagemagick equivalent.
## Prerequisites
@ -36,9 +38,24 @@ Ubuntu 13.04:
```javascript
var sharp = require("sharp");
var cropLandscape = sharp.resize("input.jpg", "output.jpg", 300, 200, "c");
var embedPortraitWhiteBorder = sharp.resize("input.jpg", "output.jpg", 200, 300, "w");
var embedPortraitBlackBorder = sharp.resize("input.jpg", "output.jpg", 200, 300, "b");
sharp.crop("input.jpg", "output.jpg", 300, 200, function(err) {
if (err) {
throw err;
}
// output.jpg is cropped input.jpg
});
sharp.embedWhite("input.jpg", "output.jpg", 200, 300, function(err) {
if (err) {
throw err;
}
// output.jpg contains input.jpg embedded with a white border
});
sharp.embedBlack("input.jpg", "output.jpg", 200, 300, function(err) {
if (err) {
throw err;
}
// output.jpg contains input.jpg embedded with a black border
});
```
## Testing [![Build Status](https://travis-ci.org/lovell/sharp.png?branch=master)](https://travis-ci.org/lovell/sharp)

13
index.js Executable file
View File

@ -0,0 +1,13 @@
var sharp = require("./build/Release/sharp");
module.exports.crop = function(input, output, width, height, callback) {
sharp.resize(input, output, width, height, "c", callback)
}
module.exports.embedWhite = function(input, output, width, height, callback) {
sharp.resize(input, output, width, height, "w", callback)
}
module.exports.embedBlack = function(input, output, width, height, callback) {
sharp.resize(input, output, width, height, "b", callback)
}

View File

@ -7,6 +7,12 @@
"type": "git",
"url": "git://github.com/lovell/sharp"
},
"devDependencies": {
"imagemagick": "*"
},
"scripts": {
"test": "node tests/perf.js"
},
"engines": {
"node": "*"
},

View File

@ -170,4 +170,4 @@ extern "C" void init(Handle<Object> target) {
NODE_SET_METHOD(target, "resize", Resize);
};
NODE_MODULE(vips, init)
NODE_MODULE(sharp, init)

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 KiB

42
tests/perf.js Executable file
View File

@ -0,0 +1,42 @@
var sharp = require("../index");
var imagemagick = require("imagemagick");
var assert = require("assert");
// http://www.flickr.com/photos/grizdave/2569067123/
var input = __dirname + "/2569067123_aca715a2ee_o.jpg";
var output = __dirname + "/output.jpg";
var width = 640;
var height = 480;
// imagemagick
var time = process.hrtime();
imagemagick.resize({
srcPath: input,
dstPath: output,
quality: 0.75,
width: width,
height: height
}, function(err) {
if (err) {
throw err;
}
var diff = process.hrtime(time);
imagemagickTime = diff[0] * 1e9 + diff[1];
console.log("imagemagick took %d nanoseconds", imagemagickTime);
// sharp
time = process.hrtime();
sharp.crop(input, output, width, height, function(err) {
if (err) {
throw err;
}
diff = process.hrtime(time);
var sharpTime = diff[0] * 1e9 + diff[1];
console.log("sharp took %d nanoseconds", sharpTime);
// diff
assert(sharpTime < imagemagickTime, "sharp was blunt");
console.log("sharp was %d%% faster", (imagemagickTime - sharpTime) / imagemagickTime * 100);
});
});