diff --git a/docs/api-input.md b/docs/api-input.md index c42ee78e..09e8b8b2 100644 --- a/docs/api-input.md +++ b/docs/api-input.md @@ -34,8 +34,9 @@ A Promises/A+ promise is returned when `callback` is not provided. - `format`: Name of decoder used to decompress image data e.g. `jpeg`, `png`, `webp`, `gif`, `svg` - `width`: Number of pixels wide - `height`: Number of pixels high -- `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L568) +- `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L636) - `channels`: Number of bands e.g. `3` for sRGB, `4` for CMYK +- `depth`: Name of pixel depth format e.g. `uchar`, `char`, `ushort`, `float` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L672) - `density`: Number of pixels per inch (DPI), if present - `hasProfile`: Boolean indicating the presence of an embedded ICC profile - `hasAlpha`: Boolean indicating the presence of an alpha transparency channel diff --git a/docs/changelog.md b/docs/changelog.md index 5bba943c..dd5ebe5b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -14,6 +14,10 @@ Requires libvips v8.5.2. [#573](https://github.com/lovell/sharp/issues/573) [@strarsis](https://github.com/strarsis) +* Include pixel depth (e.g. "uchar") when reading metadata. + [#577](https://github.com/lovell/sharp/issues/577) + [@moedusa](https://github.com/moedusa) + * Add support for Buffer and Stream-based TIFF output. [#587](https://github.com/lovell/sharp/issues/587) [@strarsis](https://github.com/strarsis) diff --git a/lib/input.js b/lib/input.js index b8c6ad83..368af83e 100644 --- a/lib/input.js +++ b/lib/input.js @@ -163,8 +163,9 @@ function clone () { * - `format`: Name of decoder used to decompress image data e.g. `jpeg`, `png`, `webp`, `gif`, `svg` * - `width`: Number of pixels wide * - `height`: Number of pixels high - * - `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L568) + * - `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L636) * - `channels`: Number of bands e.g. `3` for sRGB, `4` for CMYK + * - `depth`: Name of pixel depth format e.g. `uchar`, `char`, `ushort`, `float` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L672) * - `density`: Number of pixels per inch (DPI), if present * - `hasProfile`: Boolean indicating the presence of an embedded ICC profile * - `hasAlpha`: Boolean indicating the presence of an alpha transparency channel diff --git a/src/metadata.cc b/src/metadata.cc index fb9e352e..3e6ed9b8 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -57,6 +57,7 @@ class MetadataWorker : public Nan::AsyncWorker { baton->height = image.height(); baton->space = vips_enum_nick(VIPS_TYPE_INTERPRETATION, image.interpretation()); baton->channels = image.bands(); + baton->depth = vips_enum_nick(VIPS_TYPE_BAND_FORMAT, image.format()); if (sharp::HasDensity(image)) { baton->density = sharp::GetDensity(image); } @@ -103,6 +104,7 @@ class MetadataWorker : public Nan::AsyncWorker { Set(info, New("height").ToLocalChecked(), New(baton->height)); Set(info, New("space").ToLocalChecked(), New(baton->space).ToLocalChecked()); Set(info, New("channels").ToLocalChecked(), New(baton->channels)); + Set(info, New("depth").ToLocalChecked(), New(baton->depth).ToLocalChecked()); if (baton->density > 0) { Set(info, New("density").ToLocalChecked(), New(baton->density)); } diff --git a/src/metadata.h b/src/metadata.h index 498f213f..50175639 100644 --- a/src/metadata.h +++ b/src/metadata.h @@ -29,6 +29,7 @@ struct MetadataBaton { int height; std::string space; int channels; + std::string depth; int density; bool hasProfile; bool hasAlpha; diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 70438db4..cb8db649 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -17,6 +17,7 @@ describe('Image metadata', function () { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -35,6 +36,7 @@ describe('Image metadata', function () { assert.strictEqual(600, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual(72, metadata.density); assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -56,25 +58,24 @@ describe('Image metadata', function () { }); }); - if (sharp.format.tiff.input.file) { - it('TIFF', function (done) { - sharp(fixtures.inputTiff).metadata(function (err, metadata) { - if (err) throw err; - assert.strictEqual('tiff', metadata.format); - assert.strictEqual(2464, metadata.width); - assert.strictEqual(3248, metadata.height); - assert.strictEqual('b-w', metadata.space); - assert.strictEqual(1, metadata.channels); - assert.strictEqual(300, metadata.density); - assert.strictEqual(false, metadata.hasProfile); - assert.strictEqual(false, metadata.hasAlpha); - assert.strictEqual(1, metadata.orientation); - assert.strictEqual('undefined', typeof metadata.exif); - assert.strictEqual('undefined', typeof metadata.icc); - done(); - }); + it('TIFF', function (done) { + sharp(fixtures.inputTiff).metadata(function (err, metadata) { + if (err) throw err; + assert.strictEqual('tiff', metadata.format); + assert.strictEqual(2464, metadata.width); + assert.strictEqual(3248, metadata.height); + assert.strictEqual('b-w', metadata.space); + assert.strictEqual(1, metadata.channels); + assert.strictEqual('uchar', metadata.depth); + assert.strictEqual(300, metadata.density); + assert.strictEqual(false, metadata.hasProfile); + assert.strictEqual(false, metadata.hasAlpha); + assert.strictEqual(1, metadata.orientation); + assert.strictEqual('undefined', typeof metadata.exif); + assert.strictEqual('undefined', typeof metadata.icc); + done(); }); - } + }); it('PNG', function (done) { sharp(fixtures.inputPng).metadata(function (err, metadata) { @@ -84,6 +85,7 @@ describe('Image metadata', function () { assert.strictEqual(2074, metadata.height); assert.strictEqual('b-w', metadata.space); assert.strictEqual(1, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual(300, metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -102,6 +104,7 @@ describe('Image metadata', function () { assert.strictEqual(1536, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(4, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual(72, metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(true, metadata.hasAlpha); @@ -112,80 +115,59 @@ describe('Image metadata', function () { }); }); - if (sharp.format.webp.input.file) { - it('WebP', function (done) { - sharp(fixtures.inputWebP).metadata(function (err, metadata) { - if (err) throw err; - assert.strictEqual('webp', metadata.format); - assert.strictEqual(1024, metadata.width); - assert.strictEqual(772, metadata.height); - assert.strictEqual('srgb', metadata.space); - assert.strictEqual(3, metadata.channels); - assert.strictEqual('undefined', typeof metadata.density); - assert.strictEqual(false, metadata.hasProfile); - assert.strictEqual(false, metadata.hasAlpha); - assert.strictEqual('undefined', typeof metadata.orientation); - assert.strictEqual('undefined', typeof metadata.exif); - assert.strictEqual('undefined', typeof metadata.icc); - done(); - }); + it('WebP', function (done) { + sharp(fixtures.inputWebP).metadata(function (err, metadata) { + if (err) throw err; + assert.strictEqual('webp', metadata.format); + assert.strictEqual(1024, metadata.width); + assert.strictEqual(772, metadata.height); + assert.strictEqual('srgb', metadata.space); + assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); + assert.strictEqual('undefined', typeof metadata.density); + assert.strictEqual(false, metadata.hasProfile); + assert.strictEqual(false, metadata.hasAlpha); + assert.strictEqual('undefined', typeof metadata.orientation); + assert.strictEqual('undefined', typeof metadata.exif); + assert.strictEqual('undefined', typeof metadata.icc); + done(); }); - } + }); - if (sharp.format.gif.input.file) { - it('GIF via giflib', function (done) { - sharp(fixtures.inputGif).metadata(function (err, metadata) { - if (err) throw err; - assert.strictEqual('gif', metadata.format); - assert.strictEqual(800, metadata.width); - assert.strictEqual(533, metadata.height); - assert.strictEqual(3, metadata.channels); - assert.strictEqual('undefined', typeof metadata.density); - assert.strictEqual(false, metadata.hasProfile); - assert.strictEqual(false, metadata.hasAlpha); - assert.strictEqual('undefined', typeof metadata.orientation); - assert.strictEqual('undefined', typeof metadata.exif); - assert.strictEqual('undefined', typeof metadata.icc); - done(); - }); + it('GIF via giflib', function (done) { + sharp(fixtures.inputGif).metadata(function (err, metadata) { + if (err) throw err; + assert.strictEqual('gif', metadata.format); + assert.strictEqual(800, metadata.width); + assert.strictEqual(533, metadata.height); + assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); + assert.strictEqual('undefined', typeof metadata.density); + assert.strictEqual(false, metadata.hasProfile); + assert.strictEqual(false, metadata.hasAlpha); + assert.strictEqual('undefined', typeof metadata.orientation); + assert.strictEqual('undefined', typeof metadata.exif); + assert.strictEqual('undefined', typeof metadata.icc); + done(); }); - it('GIF grey+alpha via giflib', function (done) { - sharp(fixtures.inputGifGreyPlusAlpha).metadata(function (err, metadata) { - if (err) throw err; - assert.strictEqual('gif', metadata.format); - assert.strictEqual(2, metadata.width); - assert.strictEqual(1, metadata.height); - assert.strictEqual(2, metadata.channels); - assert.strictEqual('undefined', typeof metadata.density); - assert.strictEqual(false, metadata.hasProfile); - assert.strictEqual(true, metadata.hasAlpha); - assert.strictEqual('undefined', typeof metadata.orientation); - assert.strictEqual('undefined', typeof metadata.exif); - assert.strictEqual('undefined', typeof metadata.icc); - done(); - }); + }); + it('GIF grey+alpha via giflib', function (done) { + sharp(fixtures.inputGifGreyPlusAlpha).metadata(function (err, metadata) { + if (err) throw err; + assert.strictEqual('gif', metadata.format); + assert.strictEqual(2, metadata.width); + assert.strictEqual(1, metadata.height); + assert.strictEqual(2, metadata.channels); + assert.strictEqual('uchar', metadata.depth); + assert.strictEqual('undefined', typeof metadata.density); + assert.strictEqual(false, metadata.hasProfile); + assert.strictEqual(true, metadata.hasAlpha); + assert.strictEqual('undefined', typeof metadata.orientation); + assert.strictEqual('undefined', typeof metadata.exif); + assert.strictEqual('undefined', typeof metadata.icc); + done(); }); - } - - if (sharp.format.openslide.input.file) { - it('Aperio SVS via openslide', function (done) { - sharp(fixtures.inputSvs).metadata(function (err, metadata) { - if (err) throw err; - assert.strictEqual('openslide', metadata.format); - assert.strictEqual(2220, metadata.width); - assert.strictEqual(2967, metadata.height); - assert.strictEqual(4, metadata.channels); - assert.strictEqual('undefined', typeof metadata.density); - assert.strictEqual('rgb', metadata.space); - assert.strictEqual(false, metadata.hasProfile); - assert.strictEqual(true, metadata.hasAlpha); - assert.strictEqual('undefined', typeof metadata.orientation); - assert.strictEqual('undefined', typeof metadata.exif); - assert.strictEqual('undefined', typeof metadata.icc); - done(); - }); - }); - } + }); it('File in, Promise out', function (done) { sharp(fixtures.inputJpg).metadata().then(function (metadata) { @@ -194,6 +176,7 @@ describe('Image metadata', function () { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -222,6 +205,7 @@ describe('Image metadata', function () { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -244,6 +228,7 @@ describe('Image metadata', function () { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); @@ -264,6 +249,7 @@ describe('Image metadata', function () { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual('uchar', metadata.depth); assert.strictEqual('undefined', typeof metadata.density); assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha);