From cc633589d950b9665596910eb0a0acab885a3b4e Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Tue, 1 Jan 2019 22:10:27 +0000 Subject: [PATCH] Expose pages metadata for multi-page input images #1205 --- docs/changelog.md | 3 +++ src/metadata.cc | 12 ++++++++++++ src/metadata.h | 4 ++++ test/unit/metadata.js | 24 ++++++++++++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 9e538e8f..d43613a0 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,6 +6,9 @@ Requires libvips v8.7.0. #### v0.21.2 - TBD +* Expose `pages` and `pageHeight` metadata for multi-page input images. + [#1205](https://github.com/lovell/sharp/issues/1205) + * Prevent mutatation of options passed to `jpeg`. [#1516](https://github.com/lovell/sharp/issues/1516) diff --git a/src/metadata.cc b/src/metadata.cc index efd91214..2097f6fe 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -71,6 +71,12 @@ class MetadataWorker : public Nan::AsyncWorker { if (image.get_typeof("palette-bit-depth") == G_TYPE_INT) { baton->paletteBitDepth = image.get_int("palette-bit-depth"); } + if (image.get_typeof(VIPS_META_N_PAGES) == G_TYPE_INT) { + baton->pages = image.get_int(VIPS_META_N_PAGES); + } + if (image.get_typeof(VIPS_META_PAGE_HEIGHT) == G_TYPE_INT) { + baton->pageHeight = image.get_int(VIPS_META_PAGE_HEIGHT); + } baton->hasProfile = sharp::HasProfile(image); // Derived attributes baton->hasAlpha = sharp::HasAlpha(image); @@ -146,6 +152,12 @@ class MetadataWorker : public Nan::AsyncWorker { if (baton->paletteBitDepth > 0) { Set(info, New("paletteBitDepth").ToLocalChecked(), New(baton->paletteBitDepth)); } + if (baton->pages > 0) { + Set(info, New("pages").ToLocalChecked(), New(baton->pages)); + } + if (baton->pageHeight > 0) { + Set(info, New("pageHeight").ToLocalChecked(), New(baton->pageHeight)); + } Set(info, New("hasProfile").ToLocalChecked(), New(baton->hasProfile)); Set(info, New("hasAlpha").ToLocalChecked(), New(baton->hasAlpha)); if (baton->orientation > 0) { diff --git a/src/metadata.h b/src/metadata.h index d279e433..30ca189e 100644 --- a/src/metadata.h +++ b/src/metadata.h @@ -34,6 +34,8 @@ struct MetadataBaton { std::string chromaSubsampling; bool isProgressive; int paletteBitDepth; + int pages; + int pageHeight; bool hasProfile; bool hasAlpha; int orientation; @@ -55,6 +57,8 @@ struct MetadataBaton { density(0), isProgressive(false), paletteBitDepth(0), + pages(0), + pageHeight(0), hasProfile(false), hasAlpha(false), orientation(0), diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 6fcac1f9..fbceb32c 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -103,6 +103,30 @@ describe('Image metadata', function () { }); }); + it('Multipage TIFF', function (done) { + sharp(fixtures.inputTiffMultipage).metadata(function (err, metadata) { + if (err) throw err; + console.log(metadata); + assert.strictEqual('tiff', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); + 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('undefined', typeof metadata.chromaSubsampling); + assert.strictEqual(false, metadata.isProgressive); + assert.strictEqual(2, metadata.pages); + 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) { if (err) throw err;