Add support for ArrayBuffer input (#3548)

This commit is contained in:
Jérémy Lal 2023-02-05 10:45:17 +01:00 committed by GitHub
parent 4798d9da64
commit 9608f219bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 2 deletions

View File

@ -113,8 +113,8 @@ const debuglog = util.debuglog('sharp');
* } * }
* }).toFile('text_rgba.png'); * }).toFile('text_rgba.png');
* *
* @param {(Buffer|Uint8Array|Uint8ClampedArray|Int8Array|Uint16Array|Int16Array|Uint32Array|Int32Array|Float32Array|Float64Array|string)} [input] - if present, can be * @param {(Buffer|ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|Uint16Array|Int16Array|Uint32Array|Int32Array|Float32Array|Float64Array|string)} [input] - if present, can be
* a Buffer / Uint8Array / Uint8ClampedArray containing JPEG, PNG, WebP, AVIF, GIF, SVG or TIFF image data, or * a Buffer / ArrayBuffer / Uint8Array / Uint8ClampedArray containing JPEG, PNG, WebP, AVIF, GIF, SVG or TIFF image data, or
* a TypedArray containing raw pixel image data, or * a TypedArray containing raw pixel image data, or
* a String containing the filesystem path to an JPEG, PNG, WebP, AVIF, GIF, SVG or TIFF image file. * a String containing the filesystem path to an JPEG, PNG, WebP, AVIF, GIF, SVG or TIFF image file.
* JPEG, PNG, WebP, AVIF, GIF, SVG, TIFF or raw pixel image data can be streamed into the object when not present. * JPEG, PNG, WebP, AVIF, GIF, SVG, TIFF or raw pixel image data can be streamed into the object when not present.

1
lib/index.d.ts vendored
View File

@ -29,6 +29,7 @@ declare function sharp(options?: sharp.SharpOptions): sharp.Sharp;
declare function sharp( declare function sharp(
input?: input?:
| Buffer | Buffer
| ArrayBuffer
| Uint8Array | Uint8Array
| Uint8ClampedArray | Uint8ClampedArray
| Int8Array | Int8Array

View File

@ -47,6 +47,11 @@ function _createInputDescriptor (input, inputOptions, containerOptions) {
throw Error('Input Buffer is empty'); throw Error('Input Buffer is empty');
} }
inputDescriptor.buffer = input; inputDescriptor.buffer = input;
} else if (is.arrayBuffer(input)) {
if (input.byteLength === 0) {
throw Error('Input bit Array is empty');
}
inputDescriptor.buffer = Buffer.from(input, 0, input.byteLength);
} else if (is.typedArray(input)) { } else if (is.typedArray(input)) {
if (input.length === 0) { if (input.length === 0) {
throw Error('Input Bit Array is empty'); throw Error('Input Bit Array is empty');

View File

@ -71,6 +71,14 @@ const typedArray = function (val) {
return false; return false;
}; };
/**
* Is this value an ArrayBuffer object?
* @private
*/
const arrayBuffer = function (val) {
return val instanceof ArrayBuffer;
};
/** /**
* Is this value a non-empty string? * Is this value a non-empty string?
* @private * @private
@ -134,6 +142,7 @@ module.exports = {
bool: bool, bool: bool,
buffer: buffer, buffer: buffer,
typedArray: typedArray, typedArray: typedArray,
arrayBuffer: arrayBuffer,
string: string, string: string,
number: number, number: number,
integer: integer, integer: integer,

View File

@ -150,6 +150,23 @@ describe('Input/output', function () {
readable.pipe(pipeline).pipe(writable); readable.pipe(pipeline).pipe(writable);
}); });
it('Read from ArrayBuffer and write to Buffer', async () => {
const uint8array = Uint8Array.from([255, 255, 255, 0, 0, 0]);
const arrayBuffer = new ArrayBuffer(uint8array.byteLength);
new Uint8Array(arrayBuffer).set(uint8array);
const { data, info } = await sharp(arrayBuffer, {
raw: {
width: 2,
height: 1,
channels: 3
}
}).toBuffer({ resolveWithObject: true });
assert.deepStrictEqual(uint8array, new Uint8Array(data));
assert.strictEqual(info.width, 2);
assert.strictEqual(info.height, 1);
});
it('Read from Uint8Array and write to Buffer', async () => { it('Read from Uint8Array and write to Buffer', async () => {
const uint8array = Uint8Array.from([255, 255, 255, 0, 0, 0]); const uint8array = Uint8Array.from([255, 255, 255, 0, 0, 0]);
const { data, info } = await sharp(uint8array, { const { data, info } = await sharp(uint8array, {

View File

@ -11,6 +11,9 @@ describe('Raw pixel data', function () {
assert.throws(function () { assert.throws(function () {
sharp(Buffer.from('')); sharp(Buffer.from(''));
}, /empty/); }, /empty/);
assert.throws(function () {
sharp(new ArrayBuffer(0));
}, /empty/);
assert.throws(function () { assert.throws(function () {
sharp(new Uint8Array(0)); sharp(new Uint8Array(0));
}, /empty/); }, /empty/);