_decodeJ2K(frameIndex = 0) { let encodedPixelData = DicomParser.readEncapsulatedPixelData(this._dataSet, this._dataSet.elements.x7fe00010, frameIndex); // let pixelDataElement = this._dataSet.elements.x7fe00010; // let pixelData = new Uint8Array(this._dataSet.byteArray.buffer, pixelDataElement.dataOffset, pixelDataElement.length); let jpxImage = new Jpx(); // https://github.com/OHIF/image-JPEG2000/issues/6 // It currently returns either Int16 or Uint16 based on whether the codestream is signed or not. jpxImage.parse(encodedPixelData); // let j2kWidth = jpxImage.width; // let j2kHeight = jpxImage.height; let componentsCount = jpxImage.componentsCount; if (componentsCount !== 1) { throw 'JPEG2000 decoder returned a componentCount of ${componentsCount}, when 1 is expected'; } let tileCount = jpxImage.tiles.length; if (tileCount !== 1) { throw 'JPEG2000 decoder returned a tileCount of ${tileCount}, when 1 is expected'; } let tileComponents = jpxImage.tiles[0]; let pixelData = tileComponents.items; // window.console.log(j2kWidth, j2kHeight); return pixelData; }
_decodeJPEGBaseline(frameIndex = 0) { let encodedPixelData = DicomParser.readEncapsulatedPixelData(this._dataSet, this._dataSet.elements.x7fe00010, frameIndex); let rows = this.rows(frameIndex); let columns = this.columns(frameIndex); let bitsAllocated = this.bitsAllocated(frameIndex); let jpegBaseline = new JpegBaseline(); jpegBaseline.parse(encodedPixelData); if (bitsAllocated === 8) { return jpegBaseline.getData(columns, rows); } else if (bitsAllocated === 16) { return jpegBaseline.getData16(columns, rows); } }
// from cornerstone _decodeJPEGLossless(frameIndex = 0) { let encodedPixelData = DicomParser.readEncapsulatedPixelData(this._dataSet, this._dataSet.elements.x7fe00010, frameIndex); let pixelRepresentation = this.pixelRepresentation(frameIndex); let bitsAllocated = this.bitsAllocated(frameIndex); let byteOutput = bitsAllocated <= 8 ? 1 : 2; let decoder = new Jpeg.lossless.Decoder(); let decompressedData = decoder.decode(encodedPixelData.buffer, encodedPixelData.byteOffset, encodedPixelData.length, byteOutput); if (pixelRepresentation === 0) { if (byteOutput === 2) { return new Uint16Array(decompressedData.buffer); } else { // untested! return new Uint8Array(decompressedData.buffer); } } else { return new Int16Array(decompressedData.buffer); } }