From ce5433cbdca4e633f233fbddbdd020815a15a9c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maigret=20Aur=C3=A9lien?= Date: Tue, 21 Apr 2020 16:59:02 +0200 Subject: [PATCH] feat(decode): add tolerantDecoding option (#57) --- index.d.ts | 6 ++++-- lib/decoder.js | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/index.d.ts b/index.d.ts index 7e49ba2..6f27b79 100644 --- a/index.d.ts +++ b/index.d.ts @@ -20,9 +20,11 @@ export declare function decode(jpegData: BufferLike, opts?: false): BufferRet; export declare function decode(jpegData: BufferLike, opts: { useTArray: true, - colorTransform?: boolean + colorTransform?: boolean, + tolerantDecoding?: boolean }): UintArrRet; export declare function decode(jpegData: BufferLike, opts?: { useTArray?: false, - colorTransform?: boolean + colorTransform?: boolean, + tolerantDecoding?: boolean }): BufferRet; diff --git a/lib/decoder.js b/lib/decoder.js index 2f120ed..cac42f1 100644 --- a/lib/decoder.js +++ b/lib/decoder.js @@ -93,7 +93,7 @@ var JpegImage = (function jpegImage() { function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, - successivePrev, successive) { + successivePrev, successive, opts) { var precision = frame.precision; var samplesPerLine = frame.samplesPerLine; var scanLines = frame.scanLines; @@ -258,11 +258,17 @@ var JpegImage = (function jpegImage() { var mcuCol = mcu % mcusPerLine; var blockRow = mcuRow * component.v + row; var blockCol = mcuCol * component.h + col; + // If the block is missing and we're in tolerant mode, just skip it. + if (component.blocks[blockRow] === undefined && opts.tolerantDecoding) + return; decode(component, component.blocks[blockRow][blockCol]); } function decodeBlock(component, decode, mcu) { var blockRow = (mcu / component.blocksPerLine) | 0; var blockCol = mcu % component.blocksPerLine; + // If the block is missing and we're in tolerant mode, just skip it. + if (component.blocks[blockRow] === undefined && opts.tolerantDecoding) + return; decode(component, component.blocks[blockRow][blockCol]); } @@ -746,7 +752,7 @@ var JpegImage = (function jpegImage() { var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, - successiveApproximation >> 4, successiveApproximation & 15); + successiveApproximation >> 4, successiveApproximation & 15, this.opts); offset += processed; break; @@ -990,7 +996,8 @@ function decode(jpegData, opts) { useTArray: false, // "undefined" means "Choose whether to transform colors based on the image’s color model." colorTransform: undefined, - formatAsRGBA: true + formatAsRGBA: true, + tolerantDecoding: false }; if (opts) { if (typeof opts === 'object') { @@ -999,6 +1006,8 @@ function decode(jpegData, opts) { defaultOpts.useTArray : opts.useTArray), colorTransform: (typeof opts.colorTransform === 'undefined' ? defaultOpts.colorTransform : opts.colorTransform), + tolerantDecoding: (typeof opts.tolerantDecoding === 'undefined' ? + defaultOpts.tolerantDecoding : opts.tolerantDecoding), formatAsRGBA: (typeof opts.formatAsRGBA === 'undefined' ? defaultOpts.formatAsRGBA : opts.formatAsRGBA) }; @@ -1013,6 +1022,7 @@ function decode(jpegData, opts) { var arr = new Uint8Array(jpegData); var decoder = new JpegImage(); + decoder.opts = opts; decoder.parse(arr); decoder.colorTransform = opts.colorTransform;