From a82450796b6131afeae813354ca1def5bfc27a17 Mon Sep 17 00:00:00 2001 From: Matt Hirsch Date: Thu, 7 Jul 2016 18:15:14 -0400 Subject: [PATCH 1/2] Add extractChannel command to extract channel (aka vips band) from image --- docs/api.md | 19 ++++++++++ index.js | 16 ++++++++ src/pipeline.cc | 10 +++++ src/pipeline.h | 2 + test/fixtures/expected/extract-blue.jpg | Bin 0 -> 12662 bytes test/fixtures/expected/extract-red.jpg | Bin 0 -> 13797 bytes test/unit/extractChannel.js | 48 ++++++++++++++++++++++++ 7 files changed, 95 insertions(+) create mode 100644 test/fixtures/expected/extract-blue.jpg create mode 100644 test/fixtures/expected/extract-red.jpg create mode 100644 test/unit/extractChannel.js diff --git a/docs/api.md b/docs/api.md index 564df25a8..192a13d0c 100644 --- a/docs/api.md +++ b/docs/api.md @@ -298,6 +298,25 @@ sharp(input) }); ``` +#### extractChannel(channel) + +Extract a channel from the image. The following channel names are equivalent: + + * Red: `0, 'red'` + * Green: `1, 'green'` + * Blue: `2, 'blue'` + +The result will be a single-channel grayscale image. + +```javascript +sharp(input) + .extractChannel('green') + .toFile('input_green.jpg',function(err, info) { + // info.channels === 1 + // input_green.jpg contains the green channel of the input image + }); +``` + #### background(rgba) Set the background for the `embed`, `flatten` and `extend` operations. diff --git a/index.js b/index.js index 2bde9ce49..73ad61425 100644 --- a/index.js +++ b/index.js @@ -114,6 +114,7 @@ var Sharp = function(input, options) { withMetadataOrientation: -1, tileSize: 256, tileOverlap: 0, + extractChannel: -1, // Function to notify of queue length changes queueListener: function(queueLength) { module.exports.queue.emit('change', queueLength); @@ -302,6 +303,21 @@ Sharp.prototype.extract = function(options) { return this; }; +Sharp.prototype.extractChannel = function(channel) { + if (channel === 'red') + channel = 0; + else if (channel === 'green') + channel = 1; + else if (channel === 'blue') + channel = 2; + if(isInteger(channel) && inRange(channel,0,4)) { + this.options.extractChannel = channel; + } else { + throw new Error('Cannot extract invalid channel ' + channel); + } + return this; +}; + /* Set the background colour for embed and flatten operations. Delegates to the 'Color' module, which can throw an Error diff --git a/src/pipeline.cc b/src/pipeline.cc index f643190c8..ff6df5adb 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -782,6 +782,15 @@ class PipelineWorker : public AsyncWorker { image = Bandbool(image, baton->bandBoolOp); } + // Extract an image channel (aka vips band) + if(baton->extractChannel > -1) { + if(baton->extractChannel >= image.bands()) { + (baton->err).append("Cannot extract channel from image. Too few channels in image."); + return Error(); + } + image = image.extract_band(baton->extractChannel); + } + // Override EXIF Orientation tag if (baton->withMetadata && baton->withMetadataOrientation != -1) { SetExifOrientation(image, baton->withMetadataOrientation); @@ -1156,6 +1165,7 @@ NAN_METHOD(pipeline) { baton->extendBottom = attrAs(options, "extendBottom"); baton->extendLeft = attrAs(options, "extendLeft"); baton->extendRight = attrAs(options, "extendRight"); + baton->extractChannel = attrAs(options, "extractChannel"); // Output options baton->progressive = attrAs(options, "progressive"); baton->quality = attrAs(options, "quality"); diff --git a/src/pipeline.h b/src/pipeline.h index a18078373..fb45bc35a 100644 --- a/src/pipeline.h +++ b/src/pipeline.h @@ -93,6 +93,7 @@ struct PipelineBaton { double convKernelScale; double convKernelOffset; VipsOperationBoolean bandBoolOp; + int extractChannel; int tileSize; int tileOverlap; VipsForeignDzContainer tileContainer; @@ -153,6 +154,7 @@ struct PipelineBaton { convKernelScale(0.0), convKernelOffset(0.0), bandBoolOp(VIPS_OPERATION_BOOLEAN_LAST), + extractChannel(-1), tileSize(256), tileOverlap(0), tileContainer(VIPS_FOREIGN_DZ_CONTAINER_FS), diff --git a/test/fixtures/expected/extract-blue.jpg b/test/fixtures/expected/extract-blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2a332f9ac6e980456bb76c1a42040990f7a51ba GIT binary patch literal 12662 zcmV-+F^SIq*#FxALjVQ@1qKBK1_lKN2L}cS3J?kk2?+`m4i5|v7Zey67Zes28XYAc z8XF@V78W2ZAR{IxDJm%$A1yE~C@>``DJcKI01F5J@Bu&p0TBTI!~h%s009L70RaF2 z00000000001OWmA1qJ{I2>-+YMi2l30RsX91_B2L1p)&J000330{{dO5+MaKK?V~d zQDJd`kp~nbGNG}-6+%*y(cvUBVsh|9@fK5}G(=Q$gOjqt(*N232mt{A06zfLpzi@j zT+r9N7%W0aIrAc_l(c6Iyt*1DCkJCvNwOXBS@?(6_{%>ufN37*`&GlZNX=(>&k{&u zV$KFVYsNcS$E4!7MI$6zA=qc{de(b1MVjh_K9DmOA=R zhVd9~6g*NZA@VhK4C+UOh7=wD01b-kFB#JHODq%Gwj_^I`P6q)s#(b<4}@~X1;Zlx zy{@T0%zqnuny=$LRbxg_-zxGx*m3r|m93y}vl}_jKT66|dexT?j{_#Gdgim-Kn9*u z(PBRAIQu&2%o%%&xzA4n`~3J2!SNZ6lBzh5+KOr8ylvYO?i1Ci|YEvRrC4 zP(yCVeT8KuCf4g%1Y?-<6@6^WG)n8Nf-|tEvm)~(f4P96rJ6CEFwgtJp;rvmSx<>_LFy{l zmnU*_P72*z{OgQ)=EvtvF^u#4={vN}`1w}_LFe+WA$*CcA&5ETYSI`&fwe)v`$c`i zB?cLtqZ?^CBjH|;+5X+Nzyd`jhcG$(t7XHxU1=@@J{!pFYTNeBjOa^Dnte@Yc<&V9 z>;!N)DqAgsvByfIyy9;tA}oRLST5OdX19#n!gD+GIs2o|uqGK!i}u;V^$ zTMocqF^S=P0Mv`QPRR>P% zpDI1lHON$7l?^5{wKoF0VO_VSF4UsBh2ldt=YFDtvH>R^#*Yp&%v1HR@lqEb#Yw1V znfX!@Gq5zOr1DclMQL0Y-`JJE-o(aWSUu9Q=FQEK|JJtojxmZBLU(g-mYzJB8_)N�n;sQaLN1ulIn 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 Date: Fri, 8 Jul 2016 11:30:49 -0400 Subject: [PATCH 2/2] Add unit tests for each of the named color channels --- test/fixtures/expected/extract-green.jpg | Bin 0 -> 12712 bytes test/unit/extractChannel.js | 24 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/fixtures/expected/extract-green.jpg diff --git a/test/fixtures/expected/extract-green.jpg b/test/fixtures/expected/extract-green.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2de81c25302a9e0d1abf971de6b47eeb7aba770e GIT binary patch literal 12712 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