diff --git a/README.md b/README.md index b19df432a..1214bedfe 100755 --- a/README.md +++ b/README.md @@ -234,6 +234,7 @@ Fast access to image metadata without decoding any compressed image data. * `height`: Number of pixels high * `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `scrgb`, `cmyk`, `lab`, `xyz`, `b-w` [...](https://github.com/jcupitt/libvips/blob/master/libvips/iofuncs/enumtypes.c#L522) * `channels`: Number of bands e.g. `3` for sRGB, `4` for CMYK +* `hasProfile`: Boolean indicating the presence of an embedded ICC profile * `hasAlpha`: Boolean indicating the presence of an alpha transparency channel * `orientation`: Number value of the EXIF Orientation header, if present diff --git a/src/metadata.cc b/src/metadata.cc index 031a7c271..ee2c46e88 100755 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -20,6 +20,7 @@ struct MetadataBaton { int height; std::string space; int channels; + bool hasProfile; bool hasAlpha; int orientation; std::string err; @@ -73,6 +74,7 @@ class MetadataWorker : public NanAsyncWorker { baton->height = image->Ysize; baton->space = vips_enum_nick(VIPS_TYPE_INTERPRETATION, image->Type); baton->channels = image->Bands; + baton->hasProfile = (vips_image_get_typeof(image, VIPS_META_ICC_NAME) > 0) ? TRUE : FALSE; // Derived attributes baton->hasAlpha = HasAlpha(image); baton->orientation = ExifOrientation(image); @@ -99,6 +101,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("hasProfile"), NanNew(baton->hasProfile)); info->Set(NanNew("hasAlpha"), NanNew(baton->hasAlpha)); if (baton->orientation > 0) { info->Set(NanNew("orientation"), NanNew(baton->orientation)); diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 5d99c4fd1..13b0fe9c6 100755 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -18,6 +18,8 @@ describe('Image metadata', function() { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); + assert.strictEqual(false, metadata.hasAlpha); assert.strictEqual('undefined', typeof metadata.orientation); done(); }); @@ -31,6 +33,7 @@ describe('Image metadata', function() { assert.strictEqual(600, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); assert.strictEqual(8, metadata.orientation); done(); @@ -45,6 +48,7 @@ describe('Image metadata', function() { assert.strictEqual(3248, metadata.height); assert.strictEqual('b-w', metadata.space); assert.strictEqual(1, metadata.channels); + assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -58,6 +62,7 @@ describe('Image metadata', function() { assert.strictEqual(2074, metadata.height); assert.strictEqual('b-w', metadata.space); assert.strictEqual(1, metadata.channels); + assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -71,6 +76,7 @@ describe('Image metadata', function() { assert.strictEqual(1536, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(4, metadata.channels); + assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(true, metadata.hasAlpha); done(); }); @@ -84,6 +90,7 @@ describe('Image metadata', function() { assert.strictEqual(772, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -96,6 +103,7 @@ describe('Image metadata', function() { assert.strictEqual(800, metadata.width); assert.strictEqual(533, metadata.height); assert.strictEqual(3, metadata.channels); + assert.strictEqual(false, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -108,6 +116,7 @@ describe('Image metadata', function() { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -122,6 +131,7 @@ describe('Image metadata', function() { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }).catch(function(err) { @@ -139,6 +149,7 @@ describe('Image metadata', function() { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); done(); }); @@ -154,6 +165,7 @@ describe('Image metadata', function() { assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); assert.strictEqual(3, metadata.channels); + assert.strictEqual(true, metadata.hasProfile); assert.strictEqual(false, metadata.hasAlpha); image.resize(metadata.width / 2).toBuffer(function(err, data, info) { if (err) throw err; @@ -166,25 +178,33 @@ describe('Image metadata', function() { }); it('Keep EXIF metadata after a resize', function(done) { - sharp(fixtures.inputJpgWithExif).resize(320, 240).withMetadata().toBuffer(function(err, buffer) { - if (err) throw err; - sharp(buffer).metadata(function(err, metadata) { + sharp(fixtures.inputJpgWithExif) + .resize(320, 240) + .withMetadata() + .toBuffer(function(err, buffer) { if (err) throw err; - assert.strictEqual(8, metadata.orientation); - done(); + sharp(buffer).metadata(function(err, metadata) { + if (err) throw err; + assert.strictEqual(true, metadata.hasProfile); + assert.strictEqual(8, metadata.orientation); + done(); + }); }); - }); }); it('Remove EXIF metadata after a resize', function(done) { - sharp(fixtures.inputJpgWithExif).resize(320, 240).withMetadata(false).toBuffer(function(err, buffer) { - if (err) throw err; - sharp(buffer).metadata(function(err, metadata) { + sharp(fixtures.inputJpgWithExif) + .resize(320, 240) + .withMetadata(false) + .toBuffer(function(err, buffer) { if (err) throw err; - assert.strictEqual('undefined', typeof metadata.orientation); - done(); + sharp(buffer).metadata(function(err, metadata) { + if (err) throw err; + assert.strictEqual(false, metadata.hasProfile); + assert.strictEqual('undefined', typeof metadata.orientation); + done(); + }); }); - }); }); });