mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 10:30:15 +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.
|
||||
|
||||
`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
|
||||
|
||||
|
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
|
||||
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) {
|
||||
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;
|
||||
} else {
|
||||
throw new Error('Invalid pixel limit (1 to ' + maximum.pixels + ') ' + limit);
|
||||
|
@ -19,13 +19,14 @@
|
||||
"Bernhard K. Weisshuhn <bkw@codingforce.com>",
|
||||
"Chris Riley <criley@primedia.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",
|
||||
"scripts": {
|
||||
"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-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-packaging": "./packaging/test.sh",
|
||||
"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
|
||||
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");
|
||||
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'),
|
||||
inputPngAlphaPremultiplicationSmall: getPath('alpha-premultiply-1024x768-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
|
||||
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) {
|
||||
sharp(fixtures.inputJpg).metadata(function(err, metadata) {
|
||||
if (err) throw err;
|
||||
|
Loading…
x
Reference in New Issue
Block a user