From 513b07ddcfe83a718dde12751a72162473e8298f Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Thu, 25 Sep 2014 10:07:26 +0100 Subject: [PATCH] Add hasAlpha attribute to metadata API Provides internal sharp_image_has_alpha method Hopefully this helps with #91 --- src/sharp.cc | 16 ++++++++++++++++ tests/fixtures/blackbug.png | Bin 0 -> 107405 bytes tests/unit.js | 22 ++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 tests/fixtures/blackbug.png diff --git a/src/sharp.cc b/src/sharp.cc index f0950c01..e461dbc4 100755 --- a/src/sharp.cc +++ b/src/sharp.cc @@ -161,6 +161,19 @@ sharp_calc_crop(int const inWidth, int const inHeight, int const outWidth, int c return std::make_tuple(left, top); } +/* + Does this image have an alpha channel? + Uses colourspace interpretation with number of channels to guess this. +*/ +static bool +sharp_image_has_alpha(VipsImage *image) { + return ( + (image->Bands == 2 && image->Type == VIPS_INTERPRETATION_B_W) || + (image->Bands == 4 && image->Type != VIPS_INTERPRETATION_CMYK) || + (image->Bands == 5 && image->Type == VIPS_INTERPRETATION_CMYK) + ); +} + /* Initialise a VipsImage from a buffer. Supports JPEG, PNG and WebP. Returns the ImageType detected, if any. @@ -228,6 +241,7 @@ struct metadata_baton { int height; std::string space; int channels; + bool has_alpha; int orientation; std::string err; @@ -276,6 +290,7 @@ class MetadataWorker : public NanAsyncWorker { baton->height = image->Ysize; baton->space = vips_enum_nick(VIPS_TYPE_INTERPRETATION, image->Type); baton->channels = image->Bands; + baton->has_alpha = sharp_image_has_alpha(image); // EXIF Orientation const char *exif; if (!vips_image_get_string(image, "exif-ifd0-Orientation", &exif)) { @@ -303,6 +318,7 @@ class MetadataWorker : public NanAsyncWorker { info->Set(NanNew("height"), NanNew(baton->height)); info->Set(NanNew("space"), NanNew(baton->space)); info->Set(NanNew("channels"), NanNew(baton->channels)); + info->Set(NanNew("hasAlpha"), NanNew(baton->has_alpha)); if (baton->orientation > 0) { info->Set(NanNew("orientation"), NanNew(baton->orientation)); } diff --git a/tests/fixtures/blackbug.png b/tests/fixtures/blackbug.png new file mode 100644 index 0000000000000000000000000000000000000000..f080d05bb4c0df667353c94fb92b309d4081504d GIT binary patch literal 107405 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

Sf{`f4}|qF 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

    %kQX(%>^ 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 SDkXq_c1Ij-tH1O4;eP^0&nuGv literal 0 HcmV?d00001 diff --git a/tests/unit.js b/tests/unit.js index 4c6123ee..174be885 100755 --- a/tests/unit.js +++ b/tests/unit.js @@ -21,6 +21,7 @@ var inputJpgWithExif = path.join(fixturesPath, "Landscape_8.jpg"); // https://gi var inputJpgWithGammaHoliness = path.join(fixturesPath, "gamma_dalai_lama_gray.jpg"); // http://www.4p8.com/eric.brasseur/gamma.html var inputPng = path.join(fixturesPath, "50020484-00001.png"); // http://c.searspartsdirect.com/lis_png/PLDM/50020484-00001.png +var inputPngWithTransparency = path.join(fixturesPath, "blackbug.png"); // public domain var inputWebP = path.join(fixturesPath, "4.webp"); // http://www.gstatic.com/webp/gallery/4.webp var inputGif = path.join(fixturesPath, "Crash_test.gif"); // http://upload.wikimedia.org/wikipedia/commons/e/e3/Crash_test.gif @@ -593,6 +594,7 @@ async.series([ assert.strictEqual(600, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); assert.strictEqual(8, metadata.orientation); done(); }); @@ -606,6 +608,7 @@ async.series([ assert.strictEqual(3248, metadata.height); assert.strictEqual('b-w', metadata.space); assert.strictEqual(1, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); done(); }); }, @@ -618,6 +621,20 @@ async.series([ assert.strictEqual(2074, metadata.height); assert.strictEqual('b-w', metadata.space); assert.strictEqual(1, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); + done(); + }); + }, + // Metadata - Transparent PNG + function(done) { + sharp(inputPngWithTransparency).metadata(function(err, metadata) { + if (err) throw err; + assert.strictEqual('png', metadata.format); + assert.strictEqual(2048, metadata.width); + assert.strictEqual(1536, metadata.height); + assert.strictEqual('srgb', metadata.space); + assert.strictEqual(4, metadata.channels); + assert.strictEqual(true, metadata.hasAlpha); done(); }); }, @@ -630,6 +647,7 @@ async.series([ assert.strictEqual(772, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); done(); }); }, @@ -641,6 +659,7 @@ async.series([ assert.strictEqual(800, metadata.width); assert.strictEqual(533, metadata.height); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); done(); }); }, @@ -652,6 +671,7 @@ async.series([ assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); done(); }); }, @@ -665,6 +685,7 @@ async.series([ assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); done(); }); readable.pipe(pipeline); @@ -679,6 +700,7 @@ async.series([ assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasAlpha); image.resize(metadata.width / 2).toBuffer(function(err, data, info) { if (err) throw err; assert.strictEqual(true, data.length > 0);