diff --git a/lib/decoder.js b/lib/decoder.js index cac42f1..6f1b752 100644 --- a/lib/decoder.js +++ b/lib/decoder.js @@ -325,6 +325,18 @@ var JpegImage = (function jpegImage() { } } + if (mcu === mcuExpected) { + // Skip trailing bytes at the end of the scan - until we reach the next marker + do { + if (data[offset] === 0xFF) { + if (data[offset + 1] !== 0x00) { + break; + } + } + offset += 1; + } while (offset < data.length - 2); + } + // find marker bitsCount = 0; marker = (data[offset] << 8) | data[offset + 1]; diff --git a/test/fixtures/redbox-with-trailing-bytes.jpg b/test/fixtures/redbox-with-trailing-bytes.jpg new file mode 100644 index 0000000..35bce41 Binary files /dev/null and b/test/fixtures/redbox-with-trailing-bytes.jpg differ diff --git a/test/index.js b/test/index.js index 0f9313e..e77e66c 100644 --- a/test/index.js +++ b/test/index.js @@ -54,6 +54,15 @@ it('should be able to decode a JPEG with RST intervals', function(t) { t.end(); }); +it('should be able to decode a JPEG with trailing bytes', function(t) { + var jpegData = fixture('redbox-with-trailing-bytes.jpg'); + var rawImageData = jpeg.decode(jpegData); + var expected = fixture('redbox.jpg'); + var rawExpectedImageData = jpeg.decode(expected); + t.deepEqual(rawImageData.data, rawExpectedImageData.data); + t.end(); +}); + it('should be able to decode a grayscale JPEG', function(t) { var jpegData = fixture('apsara.jpg'); var rawImageData = jpeg.decode(jpegData);