diff --git a/docs/src/content/docs/api-output.md b/docs/src/content/docs/api-output.md
index f41ac47a8..fb489812c 100644
--- a/docs/src/content/docs/api-output.md
+++ b/docs/src/content/docs/api-output.md
@@ -158,7 +158,7 @@ Set output density (DPI) in EXIF metadata.
| Param | Type | Description |
| --- | --- | --- |
-| density | number | Number of pixels per inch (DPI). |
+| density | number | Number of pixels per inch (DPI), between 1 and 100000. |
**Example**
```js
@@ -435,7 +435,7 @@ Allows orientation and density to be set or updated.
| --- | --- | --- |
| [options] | Object | |
| [options.orientation] | number | Used to update the EXIF `Orientation` tag, integer between 1 and 8. |
-| [options.density] | number | Number of pixels per inch (DPI). |
+| [options.density] | number | Number of pixels per inch (DPI), between 1 and 100000. |
**Example**
```js
diff --git a/lib/output.mjs b/lib/output.mjs
index b28afd795..a5ec90cdb 100644
--- a/lib/output.mjs
+++ b/lib/output.mjs
@@ -205,15 +205,15 @@ function toUint8Array () {
* .withDensity(96)
* .toBuffer();
*
- * @param {number} density Number of pixels per inch (DPI).
+ * @param {number} density Number of pixels per inch (DPI), between 1 and 100000.
* @returns {Sharp}
* @throws {Error} Invalid parameters
*/
function withDensity (density) {
- if (is.number(density) && density > 0) {
+ if (is.number(density) && is.inRange(density, 1, 100000)) {
this.options.withMetadataDensity = density;
} else {
- throw is.invalidParameterError('density', 'positive number', density);
+ throw is.invalidParameterError('density', 'number between 1 and 100000', density);
}
return this.keepExif();
}
@@ -520,7 +520,7 @@ function keepMetadata () {
*
* @param {Object} [options]
* @param {number} [options.orientation] Used to update the EXIF `Orientation` tag, integer between 1 and 8.
- * @param {number} [options.density] Number of pixels per inch (DPI).
+ * @param {number} [options.density] Number of pixels per inch (DPI), between 1 and 100000.
* @returns {Sharp}
* @throws {Error} Invalid parameters
*/
@@ -536,10 +536,10 @@ function withMetadata (options) {
}
}
if (is.defined(options.density)) {
- if (is.number(options.density) && options.density > 0) {
+ if (is.number(options.density) && is.inRange(options.density, 1, 100000)) {
this.options.withMetadataDensity = options.density;
} else {
- throw is.invalidParameterError('density', 'positive number', options.density);
+ throw is.invalidParameterError('density', 'number between 1 and 100000', options.density);
}
}
if (is.defined(options.icc)) {
diff --git a/test/unit/metadata.js b/test/unit/metadata.js
index 903a9b79c..7dd3a0ec4 100644
--- a/test/unit/metadata.js
+++ b/test/unit/metadata.js
@@ -1774,6 +1774,10 @@ suite('Image metadata', () => {
t.plan(1);
t.assert.throws(() => sharp().withMetadata({ density: -1 }));
});
+ test('Out of range density', (t) => {
+ t.plan(1);
+ t.assert.throws(() => sharp().withMetadata({ density: 100001 }), /Expected number between 1 and 100000 for density but received 100001 of type number/);
+ });
test('Non string icc', (t) => {
t.plan(1);
t.assert.throws(() => sharp().withMetadata({ icc: true }));
@@ -1804,11 +1808,15 @@ suite('Image metadata', () => {
});
test('withDensity missing density', (t) => {
t.plan(1);
- t.assert.throws(() => sharp().withDensity(), /Expected positive number for density but received undefined of type undefined/);
+ t.assert.throws(() => sharp().withDensity(), /Expected number between 1 and 100000 for density but received undefined of type undefined/);
});
test('withDensity invalid density', (t) => {
t.plan(1);
- t.assert.throws(() => sharp().withDensity('invalid'), /Expected positive number for density but received invalid of type string/);
+ t.assert.throws(() => sharp().withDensity('invalid'), /Expected number between 1 and 100000 for density but received invalid of type string/);
+ });
+ test('withDensity out of range density', (t) => {
+ t.plan(1);
+ t.assert.throws(() => sharp().withDensity(100001), /Expected number between 1 and 100000 for density but received 100001 of type number/);
});
});
});
\ No newline at end of file