Adds color components decoding to the JPEG
This commit is contained in:
parent
2449142fc3
commit
6235e3a61c
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user