mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 18:40:16 +02:00
Ability to disable limitInputPixels #250
Update docs Added a giant image for testing Adding myself to contributors Added tests to verify giant image can be opened Extend test-win time limit (because of large images)
This commit is contained in:
parent
b2d7d4c4a9
commit
8c9c070caf
@ -113,7 +113,8 @@ This will reduce memory usage and can improve performance on some systems.
|
|||||||
|
|
||||||
Do not process input images where the number of pixels (width * height) exceeds this limit.
|
Do not process input images where the number of pixels (width * height) exceeds this limit.
|
||||||
|
|
||||||
`pixels` is the integral Number of pixels, with a value between 1 and the default 268402689 (0x3FFF * 0x3FFF).
|
`pixels` is either an integral Number of pixels, with a value between 1 and the default 268402689 (0x3FFF * 0x3FFF) or
|
||||||
|
a boolean. `false` will disable checking while `true` will revert to the default limit.
|
||||||
|
|
||||||
### Resizing
|
### Resizing
|
||||||
|
|
||||||
|
11
index.js
11
index.js
@ -722,10 +722,17 @@ Sharp.prototype.resize = function(width, height) {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Limit the total number of pixels for input images
|
Limit the total number of pixels for input images
|
||||||
Assumes the image dimensions contained in the file header can be trusted
|
Assumes the image dimensions contained in the file header can be trusted.
|
||||||
|
Alternatively can use boolean to disable or reset to default (maximum pixels)
|
||||||
*/
|
*/
|
||||||
Sharp.prototype.limitInputPixels = function(limit) {
|
Sharp.prototype.limitInputPixels = function(limit) {
|
||||||
if (typeof limit === 'number' && !Number.isNaN(limit) && limit % 1 === 0 && limit > 0) {
|
//if we pass in false we represent the integer as 0 to disable
|
||||||
|
if(limit === false) {
|
||||||
|
limit = 0;
|
||||||
|
} else if(limit === true) {
|
||||||
|
limit = maximum.pixels;
|
||||||
|
}
|
||||||
|
if (typeof limit === 'number' && !Number.isNaN(limit) && limit % 1 === 0 && limit >= 0) {
|
||||||
this.options.limitInputPixels = limit;
|
this.options.limitInputPixels = limit;
|
||||||
} else {
|
} else {
|
||||||
throw new Error('Invalid pixel limit (1 to ' + maximum.pixels + ') ' + limit);
|
throw new Error('Invalid pixel limit (1 to ' + maximum.pixels + ') ' + limit);
|
||||||
|
@ -19,13 +19,14 @@
|
|||||||
"Bernhard K. Weisshuhn <bkw@codingforce.com>",
|
"Bernhard K. Weisshuhn <bkw@codingforce.com>",
|
||||||
"Chris Riley <criley@primedia.com>",
|
"Chris Riley <criley@primedia.com>",
|
||||||
"David Carley <dacarley@gmail.com>",
|
"David Carley <dacarley@gmail.com>",
|
||||||
"John Tobin <john@limelightmobileinc.com>"
|
"John Tobin <john@limelightmobileinc.com>",
|
||||||
|
"Kenton Gray <kentongray@gmail.com>"
|
||||||
],
|
],
|
||||||
"description": "High performance Node.js module to resize JPEG, PNG, WebP and TIFF images using the libvips library",
|
"description": "High performance Node.js module to resize JPEG, PNG, WebP and TIFF images using the libvips library",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "rm -rf node_modules/ build/ include/ lib/ coverage/ test/fixtures/output.*",
|
"clean": "rm -rf node_modules/ build/ include/ lib/ coverage/ test/fixtures/output.*",
|
||||||
"test": "VIPS_WARNING=0 node ./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- --slow=5000 --timeout=30000 ./test/unit/*.js",
|
"test": "VIPS_WARNING=0 node ./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- --slow=5000 --timeout=30000 ./test/unit/*.js",
|
||||||
"test-win": "node ./node_modules/mocha/bin/mocha --slow=5000 --timeout=30000 ./test/unit/*.js",
|
"test-win": "node ./node_modules/mocha/bin/mocha --slow=5000 --timeout=60000 ./test/unit/*.js",
|
||||||
"test-leak": "./test/leak/leak.sh",
|
"test-leak": "./test/leak/leak.sh",
|
||||||
"test-packaging": "./packaging/test.sh",
|
"test-packaging": "./packaging/test.sh",
|
||||||
"test-clean": "rm -rf coverage/ test/fixtures/output.* && npm install && npm test"
|
"test-clean": "rm -rf coverage/ test/fixtures/output.* && npm install && npm test"
|
||||||
|
@ -158,7 +158,8 @@ class PipelineWorker : public AsyncWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Limit input images to a given number of pixels, where pixels = width * height
|
// Limit input images to a given number of pixels, where pixels = width * height
|
||||||
if (image.width() * image.height() > baton->limitInputPixels) {
|
// Ignore if 0
|
||||||
|
if (baton->limitInputPixels > 0 && image.width() * image.height() > baton->limitInputPixels) {
|
||||||
(baton->err).append("Input image exceeds pixel limit");
|
(baton->err).append("Input image exceeds pixel limit");
|
||||||
return Error();
|
return Error();
|
||||||
}
|
}
|
||||||
|
BIN
test/fixtures/giant-image.png
vendored
Normal file
BIN
test/fixtures/giant-image.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
1
test/fixtures/index.js
vendored
1
test/fixtures/index.js
vendored
@ -79,6 +79,7 @@ module.exports = {
|
|||||||
inputPngOverlayLayer2LowAlpha: getPath('alpha-layer-2-ink-low-alpha.png'),
|
inputPngOverlayLayer2LowAlpha: getPath('alpha-layer-2-ink-low-alpha.png'),
|
||||||
inputPngAlphaPremultiplicationSmall: getPath('alpha-premultiply-1024x768-paper.png'),
|
inputPngAlphaPremultiplicationSmall: getPath('alpha-premultiply-1024x768-paper.png'),
|
||||||
inputPngAlphaPremultiplicationLarge: getPath('alpha-premultiply-2048x1536-paper.png'),
|
inputPngAlphaPremultiplicationLarge: getPath('alpha-premultiply-2048x1536-paper.png'),
|
||||||
|
inputPngLarge: getPath('giant-image.png'),
|
||||||
|
|
||||||
inputWebP: getPath('4.webp'), // http://www.gstatic.com/webp/gallery/4.webp
|
inputWebP: getPath('4.webp'), // http://www.gstatic.com/webp/gallery/4.webp
|
||||||
inputWebPWithTransparency: getPath('5_webp_a.webp'), // http://www.gstatic.com/webp/gallery3/5_webp_a.webp
|
inputWebPWithTransparency: getPath('5_webp_a.webp'), // http://www.gstatic.com/webp/gallery3/5_webp_a.webp
|
||||||
|
@ -876,6 +876,24 @@ describe('Input/output', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Disabling limit works', function(done) {
|
||||||
|
sharp(fixtures.inputPngLarge)
|
||||||
|
.limitInputPixels(false)
|
||||||
|
.toBuffer(function(err) {
|
||||||
|
assert.strictEqual(true, !err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Enabling default limit fails works and fails with a large image', function(done) {
|
||||||
|
sharp(fixtures.inputPngLarge)
|
||||||
|
.limitInputPixels(true)
|
||||||
|
.toBuffer(function(err) {
|
||||||
|
assert.strictEqual(true, !!err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('Smaller than input fails', function(done) {
|
it('Smaller than input fails', function(done) {
|
||||||
sharp(fixtures.inputJpg).metadata(function(err, metadata) {
|
sharp(fixtures.inputJpg).metadata(function(err, metadata) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user