From 9de8fae6743af00faf41c7cc28b503c3dc41f137 Mon Sep 17 00:00:00 2001 From: Wouter Verweirder Date: Tue, 9 Dec 2014 20:06:31 +0100 Subject: [PATCH] pass in a raw pixelBuffer to the open command --- examples/open_pixelbuffer.js | 51 +++++++++++++++++++++++++++++++++ lib/defs.js | 2 +- lib/obtain.js | 14 ++++++--- tests/02.operations/001.open.js | 20 +++++++++++++ 4 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 examples/open_pixelbuffer.js diff --git a/examples/open_pixelbuffer.js b/examples/open_pixelbuffer.js new file mode 100644 index 00000000..3e0d6551 --- /dev/null +++ b/examples/open_pixelbuffer.js @@ -0,0 +1,51 @@ +/** + * Example for using LWIP to open a raw pixel buffer + */ + +var path = require('path'), + lwip = require('../'); + +var w = 90; +var h = 90; +var channelSize = w * h; +var size = channelSize * 4; +var redChannelEnd = channelSize * 1; +var greenChannelEnd = channelSize * 2; +var blueChannelEnd = channelSize * 3; +var alphaChannelEnd = channelSize * 4; +var i, x; + +var buffer = new Buffer(size); +for(i = blueChannelEnd; i < alphaChannelEnd; i++) { + buffer[i] = 100; +} +for(var y = 0; y < h; y++) { + for(x = 0; x < 30; x++) { + i = y * w + x; + buffer[i] = 255; + buffer[i + redChannelEnd] = 0; + buffer[i + greenChannelEnd] = 0; + } + for(x = 30; x < 60; x++) { + i = y * w + x; + buffer[i] = 0; + buffer[i + redChannelEnd] = 255; + buffer[i + greenChannelEnd] = 0; + } + for(x = 60; x < 90; x++) { + i = y * w + x; + buffer[i] = 0; + buffer[i + redChannelEnd] = 0; + buffer[i + greenChannelEnd] = 255; + } +} + +lwip.open(buffer, { width: w, height: h, trans: true }, function(err, image) { + if (err) return console.log("err open", err); + image.batch() + .blur(9) + .writeFile('image_from_pixelbuffer.png', function(err){ + if (err) return console.log("err write", err); + console.log('done'); + }); +}); diff --git a/lib/defs.js b/lib/defs.js index 984e7f0d..785f8974 100644 --- a/lib/defs.js +++ b/lib/defs.js @@ -85,7 +85,7 @@ type: '*' }, { name: 'type', - type: 'string', + types: ['string', 'hash'], optional: true }, { name: 'callback', diff --git a/lib/obtain.js b/lib/obtain.js index 476fb168..fc7423df 100644 --- a/lib/obtain.js +++ b/lib/obtain.js @@ -28,10 +28,16 @@ }); }); } else if (source instanceof Buffer) { - var opener = getOpener(type); - opener(source, function(err, pixelsBuf, width, height, channels, trans) { - callback(err, err ? null : new Image(pixelsBuf, width, height, trans)); - }); + if(typeof type === 'object') { + if(type.width && type.height) { + callback(null, new Image(source, type.width, type.height, type.trans)); + } else throw Error("Missing width and height"); + } else { + var opener = getOpener(type); + opener(source, function(err, pixelsBuf, width, height, channels, trans) { + callback(err, err ? null : new Image(pixelsBuf, width, height, trans)); + }); + } } else throw Error("Invalid source"); }); } diff --git a/tests/02.operations/001.open.js b/tests/02.operations/001.open.js index 74af5d62..c9a4909e 100644 --- a/tests/02.operations/001.open.js +++ b/tests/02.operations/001.open.js @@ -188,4 +188,24 @@ describe('lwip.open', function() { }); }); + + describe('raw pixel buffer', function() { + + describe('raw pixel buffer', function(){ + var buffer; + before(function(done) { + buffer = new Buffer(100 * 100 * 4); + done(); + }); + + it('should succeed', function(done) { + lwip.open(buffer, { width: 100, height: 100, trans: true }, function(err, img) { + should(err).not.be.Error; + img.should.be.OK; + done(); + }); + }); + }); + + }); });