diff --git a/docs/api-input.md b/docs/api-input.md index f15677b6..067d5c06 100644 --- a/docs/api-input.md +++ b/docs/api-input.md @@ -25,6 +25,7 @@ Fast access to (uncached) image metadata without decoding any compressed image d 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` +- `size`: Total size of image in bytes, for Stream and Buffer input only - `width`: Number of pixels wide (EXIF orientation is not taken into consideration) - `height`: Number of pixels high (EXIF orientation is not taken into consideration) - `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...][1] diff --git a/docs/changelog.md b/docs/changelog.md index 348a78cf..37cd3ce9 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -19,6 +19,9 @@ Requires libvips v8.7.0. Per-operation `background` options added to `resize`, `extend` and `flatten` operations. [#1392](https://github.com/lovell/sharp/issues/1392) +* Add `size` to `metadata` response (Stream and Buffer input only). + [#695](https://github.com/lovell/sharp/issues/695) + * Switch from custom trim operation to `vips_find_trim`. [#914](https://github.com/lovell/sharp/issues/914) diff --git a/lib/input.js b/lib/input.js index 5850f76b..fcfbba73 100644 --- a/lib/input.js +++ b/lib/input.js @@ -177,6 +177,7 @@ function clone () { * 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` + * - `size`: Total size of image in bytes, for Stream and Buffer input only * - `width`: Number of pixels wide (EXIF orientation is not taken into consideration) * - `height`: Number of pixels high (EXIF orientation is not taken into consideration) * - `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://github.com/libvips/libvips/blob/master/libvips/iofuncs/enumtypes.c#L636) diff --git a/src/metadata.cc b/src/metadata.cc index 12490d1d..394209f2 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -123,6 +123,9 @@ class MetadataWorker : public Nan::AsyncWorker { // Metadata Object v8::Local info = New(); Set(info, New("format").ToLocalChecked(), New(baton->format).ToLocalChecked()); + if (baton->input->bufferLength > 0) { + Set(info, New("size").ToLocalChecked(), New(static_cast(baton->input->bufferLength))); + } Set(info, New("width").ToLocalChecked(), New(baton->width)); Set(info, New("height").ToLocalChecked(), New(baton->height)); Set(info, New("space").ToLocalChecked(), New(baton->space).ToLocalChecked()); diff --git a/test/unit/metadata.js b/test/unit/metadata.js index 569d12f3..b846a0c4 100644 --- a/test/unit/metadata.js +++ b/test/unit/metadata.js @@ -13,6 +13,7 @@ describe('Image metadata', function () { sharp(fixtures.inputJpg).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('jpeg', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2725, metadata.width); assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -34,6 +35,7 @@ describe('Image metadata', function () { sharp(fixtures.inputJpgWithExif).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('jpeg', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(450, metadata.width); assert.strictEqual(600, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -83,6 +85,7 @@ describe('Image metadata', function () { sharp(fixtures.inputTiff).metadata(function (err, metadata) { if (err) throw err; 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); @@ -104,6 +107,7 @@ describe('Image metadata', function () { sharp(fixtures.inputPng).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('png', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2809, metadata.width); assert.strictEqual(2074, metadata.height); assert.strictEqual('b-w', metadata.space); @@ -125,6 +129,7 @@ describe('Image metadata', function () { sharp(fixtures.inputPngWithTransparency).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('png', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2048, metadata.width); assert.strictEqual(1536, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -146,6 +151,7 @@ describe('Image metadata', function () { sharp(fixtures.inputWebP).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('webp', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(1024, metadata.width); assert.strictEqual(772, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -167,6 +173,7 @@ describe('Image metadata', function () { sharp(fixtures.inputGif).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('gif', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(800, metadata.width); assert.strictEqual(533, metadata.height); assert.strictEqual(3, metadata.channels); @@ -186,6 +193,7 @@ describe('Image metadata', function () { sharp(fixtures.inputGifGreyPlusAlpha).metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('gif', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2, metadata.width); assert.strictEqual(1, metadata.height); assert.strictEqual(2, metadata.channels); @@ -205,6 +213,7 @@ describe('Image metadata', function () { it('File in, Promise out', function (done) { sharp(fixtures.inputJpg).metadata().then(function (metadata) { assert.strictEqual('jpeg', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2725, metadata.width); assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -236,6 +245,7 @@ describe('Image metadata', function () { const pipeline = sharp(); pipeline.metadata().then(function (metadata) { assert.strictEqual('jpeg', metadata.format); + assert.strictEqual(829183, metadata.size); assert.strictEqual(2725, metadata.width); assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -250,9 +260,7 @@ describe('Image metadata', function () { assert.strictEqual('undefined', typeof metadata.exif); assert.strictEqual('undefined', typeof metadata.icc); done(); - }).catch(function (err) { - throw err; - }); + }).catch(done); readable.pipe(pipeline); }); @@ -261,6 +269,7 @@ describe('Image metadata', function () { const pipeline = sharp().metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('jpeg', metadata.format); + assert.strictEqual(829183, metadata.size); assert.strictEqual(2725, metadata.width); assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space); @@ -284,6 +293,7 @@ describe('Image metadata', function () { image.metadata(function (err, metadata) { if (err) throw err; assert.strictEqual('jpeg', metadata.format); + assert.strictEqual('undefined', typeof metadata.size); assert.strictEqual(2725, metadata.width); assert.strictEqual(2225, metadata.height); assert.strictEqual('srgb', metadata.space);