diff --git a/src/pipeline.cc b/src/pipeline.cc index 63aef9d9..79905bdc 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -103,14 +103,19 @@ class PipelineWorker : public AsyncWorker { // From buffer if (baton->rawWidth > 0 && baton->rawHeight > 0 && baton->rawChannels > 0) { // Raw, uncompressed pixel data - image = VImage::new_from_memory(baton->bufferIn, baton->bufferInLength, - baton->rawWidth, baton->rawHeight, baton->rawChannels, VIPS_FORMAT_UCHAR); - if (baton->rawChannels < 3) { - image.get_image()->Type = VIPS_INTERPRETATION_B_W; - } else { - image.get_image()->Type = VIPS_INTERPRETATION_sRGB; + try { + image = VImage::new_from_memory(baton->bufferIn, baton->bufferInLength, + baton->rawWidth, baton->rawHeight, baton->rawChannels, VIPS_FORMAT_UCHAR); + if (baton->rawChannels < 3) { + image.get_image()->Type = VIPS_INTERPRETATION_B_W; + } else { + image.get_image()->Type = VIPS_INTERPRETATION_sRGB; + } + inputImageType = ImageType::RAW; + } catch(VError const &err) { + (baton->err).append(err.what()); + inputImageType = ImageType::UNKNOWN; } - inputImageType = ImageType::RAW; } else { // Compressed data inputImageType = DetermineImageType(baton->bufferIn, baton->bufferInLength); @@ -656,7 +661,8 @@ class PipelineWorker : public AsyncWorker { // Number of channels used in output image baton->channels = image.bands(); - + baton->width = image.width(); + baton->height = image.height(); // Output if (baton->fileOut == "") { // Buffer output diff --git a/test/fixtures/flowers.jpeg b/test/fixtures/flowers.jpeg new file mode 100644 index 00000000..1ab920af Binary files /dev/null and b/test/fixtures/flowers.jpeg differ diff --git a/test/fixtures/index.js b/test/fixtures/index.js index 6d80af16..04839b7a 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -90,6 +90,8 @@ module.exports = { inputSvs: getPath('CMU-1-Small-Region.svs'), // http://openslide.cs.cmu.edu/download/openslide-testdata/Aperio/CMU-1-Small-Region.svs + inputJPGBig: getPath('flowers.jpeg'), + outputJpg: getPath('output.jpg'), outputPng: getPath('output.png'), outputWebP: getPath('output.webp'), diff --git a/test/unit/io.js b/test/unit/io.js index a6083208..e94f98c8 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -1031,4 +1031,32 @@ describe('Input/output', function() { }); }); + it('Info event data', function(done) { + var readable = fs.createReadStream(fixtures.inputJPGBig); + var inPipeline = sharp() + .resize(840) + .raw() + .on('info', function(info) { + assert.strictEqual(840, info.width); + assert.strictEqual(472, info.height); + assert.strictEqual(3, info.channels); + }); + var badPipeline = sharp(null, {raw: {width: 840, height: 473, channels: 3}}) + .toFormat('jpeg') + .toBuffer(function(err, data, info) { + assert.strictEqual(err.message.indexOf('memory area too small') > 0, true); + readable = fs.createReadStream(fixtures.inputJPGBig); + var goodPipeline = sharp(null, {raw: {width: 840, height: 472, channels: 3}}) + .toFormat('jpeg') + .toBuffer(function(err, data, info) { + if (err) throw err; + done(); + }); + inPipeline = sharp() + .resize(840) + .raw(); + readable.pipe(inPipeline).pipe(goodPipeline); + }); + readable.pipe(inPipeline).pipe(badPipeline); + }); });