Adds color components decoding to the JPEG

This commit is contained in:
Yury Delendik 2014-06-03 08:51:57 -05:00
parent 2449142fc3
commit 6235e3a61c
2 changed files with 32 additions and 5 deletions

View File

@ -811,7 +811,7 @@ var JpegImage = (function jpegImage() {
var scaleX = this.width / width, scaleY = this.height / height;
var component, componentScaleX, componentScaleY, blocksPerScanline;
var x, y, i, j;
var x, y, i, j, k;
var index;
var offset = 0;
var output;
@ -843,6 +843,17 @@ var JpegImage = (function jpegImage() {
}
}
}
// decodeTransform will contains pairs of multiplier (-256..256) and
// additive
var transform = this.decodeTransform;
if (transform) {
for (i = 0; i < dataLength;) {
for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];
}
}
}
return data;
},
@ -852,8 +863,6 @@ var JpegImage = (function jpegImage() {
return true;
} else if (this.numComponents == 3) {
return true;
} else if (typeof this.colorTransform !== 'undefined') {
return !!this.colorTransform;
} else {
return false;
}

View File

@ -878,9 +878,27 @@ var JpegStream = (function JpegStreamClosure() {
}
try {
var jpegImage = new JpegImage();
if (this.colorTransform != -1) {
jpegImage.colorTransform = this.colorTransform;
// checking if values needs to be transformed before conversion
if (this.dict && isArray(this.dict.get('Decode'))) {
var decodeArr = this.dict.get('Decode');
var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
var decodeArrLength = decodeArr.length;
var transform = new Int32Array(decodeArrLength);
var transformNeeded = false;
var maxValue = (1 << bitsPerComponent) - 1;
for (var i = 0; i < decodeArrLength; i += 2) {
transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
transform[i + 1] = (decodeArr[i] * maxValue) | 0;
if (transform[i] !== 256 || transform[i + 1] !== 0) {
transformNeeded = true;
}
}
if (transformNeeded) {
jpegImage.decodeTransform = transform;
}
}
jpegImage.parse(this.bytes);
var data = jpegImage.getData(this.drawWidth, this.drawHeight,
/* forceRGBoutput = */true);