Pull Request https://github.com/chafey/cornerstoneWADOImageLoader/pull/65 https://github.com/chafey/cornerstoneWADOImageLoader/pull/68
This commit is contained in:
parent
74b99cb28d
commit
3d99821117
@ -323,7 +323,7 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
}
|
}
|
||||||
else if(imageFrame.photometricInterpretation === "YBR_FULL" )
|
else if(imageFrame.photometricInterpretation === "YBR_FULL" )
|
||||||
{
|
{
|
||||||
convertYBRFull(imageFrame, rgbaBuffer);
|
convertRGB(imageFrame, rgbaBuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -352,11 +352,6 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1 '; // XRF
|
sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1 '; // XRF
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSizeInBytes(imageFrame) {
|
|
||||||
var bytesPerPixel = Math.round(imageFrame.bitsAllocated / 8);
|
|
||||||
return imageFrame.rows * imageFrame.columns * bytesPerPixel * imageFrame.samplesPerPixel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to set pixel data to the right typed array. This is needed because web workers
|
* Helper function to set pixel data to the right typed array. This is needed because web workers
|
||||||
* can transfer array buffers but not typed arrays
|
* can transfer array buffers but not typed arrays
|
||||||
@ -379,17 +374,35 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
var imageFrame = cornerstoneWADOImageLoader.getImageFrame(imageId);
|
var imageFrame = cornerstoneWADOImageLoader.getImageFrame(imageId);
|
||||||
var decodePromise = cornerstoneWADOImageLoader.decodeImageFrame(imageFrame, transferSyntax, pixelData, canvas, options);
|
var decodePromise = cornerstoneWADOImageLoader.decodeImageFrame(imageFrame, transferSyntax, pixelData, canvas, options);
|
||||||
decodePromise.then(function(imageFrame) {
|
decodePromise.then(function(imageFrame) {
|
||||||
setPixelDataType(imageFrame);
|
|
||||||
|
|
||||||
//var imagePixelModule = metaDataProvider('imagePixelModule', imageId);
|
//var imagePixelModule = metaDataProvider('imagePixelModule', imageId);
|
||||||
var imagePlaneModule = cornerstone.metaData.get('imagePlaneModule', imageId);
|
var imagePlaneModule = cornerstone.metaData.get('imagePlaneModule', imageId);
|
||||||
var voiLutModule = cornerstone.metaData.get('voiLutModule', imageId);
|
var voiLutModule = cornerstone.metaData.get('voiLutModule', imageId);
|
||||||
var modalityLutModule = cornerstone.metaData.get('modalityLutModule', imageId);
|
var modalityLutModule = cornerstone.metaData.get('modalityLutModule', imageId);
|
||||||
var sopCommonModule = cornerstone.metaData.get('sopCommonModule', imageId);
|
var sopCommonModule = cornerstone.metaData.get('sopCommonModule', imageId);
|
||||||
|
var isColorImage = cornerstoneWADOImageLoader.isColorImage(imageFrame.photometricInterpretation);
|
||||||
|
|
||||||
|
// JPEGBaseline (8 bits) is already returning the pixel data in the right format (rgba)
|
||||||
|
// because it's using a canvas to load and decode images.
|
||||||
|
if(!cornerstoneWADOImageLoader.isJPEGBaseline8Bit(imageFrame, transferSyntax)) {
|
||||||
|
setPixelDataType(imageFrame);
|
||||||
|
|
||||||
|
// convert color space
|
||||||
|
if(isColorImage) {
|
||||||
|
// setup the canvas context
|
||||||
|
canvas.height = imageFrame.rows;
|
||||||
|
canvas.width = imageFrame.columns;
|
||||||
|
|
||||||
|
var context = canvas.getContext('2d');
|
||||||
|
var imageData = context.createImageData(imageFrame.columns, imageFrame.rows);
|
||||||
|
cornerstoneWADOImageLoader.convertColorSpace(imageFrame, imageData);
|
||||||
|
imageFrame.imageData = imageData;
|
||||||
|
imageFrame.pixelData = imageData.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var image = {
|
var image = {
|
||||||
imageId: imageId,
|
imageId: imageId,
|
||||||
color: cornerstoneWADOImageLoader.isColorImage(imageFrame.photometricInterpretation),
|
color: isColorImage,
|
||||||
columnPixelSpacing: imagePlaneModule.pixelSpacing ? imagePlaneModule.pixelSpacing[1] : undefined,
|
columnPixelSpacing: imagePlaneModule.pixelSpacing ? imagePlaneModule.pixelSpacing[1] : undefined,
|
||||||
columns: imageFrame.columns,
|
columns: imageFrame.columns,
|
||||||
height: imageFrame.rows,
|
height: imageFrame.rows,
|
||||||
@ -400,7 +413,7 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
render: undefined, // set below
|
render: undefined, // set below
|
||||||
rowPixelSpacing: imagePlaneModule.pixelSpacing ? imagePlaneModule.pixelSpacing[0] : undefined,
|
rowPixelSpacing: imagePlaneModule.pixelSpacing ? imagePlaneModule.pixelSpacing[0] : undefined,
|
||||||
rows: imageFrame.rows,
|
rows: imageFrame.rows,
|
||||||
sizeInBytes: getSizeInBytes(imageFrame),
|
sizeInBytes: imageFrame.pixelData.length,
|
||||||
slope: modalityLutModule.rescaleSlope ? modalityLutModule.rescaleSlope: 1,
|
slope: modalityLutModule.rescaleSlope ? modalityLutModule.rescaleSlope: 1,
|
||||||
width: imageFrame.columns,
|
width: imageFrame.columns,
|
||||||
windowCenter: voiLutModule.windowCenter ? voiLutModule.windowCenter[0] : undefined,
|
windowCenter: voiLutModule.windowCenter ? voiLutModule.windowCenter[0] : undefined,
|
||||||
@ -409,25 +422,11 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
webWorkerTimeInMS: imageFrame.webWorkerTimeInMS
|
webWorkerTimeInMS: imageFrame.webWorkerTimeInMS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// add function to return pixel data
|
// add function to return pixel data
|
||||||
image.getPixelData = function() {
|
image.getPixelData = function() {
|
||||||
return imageFrame.pixelData;
|
return imageFrame.pixelData;
|
||||||
};
|
};
|
||||||
|
|
||||||
// convert color space
|
|
||||||
if(image.color) {
|
|
||||||
// setup the canvas context
|
|
||||||
canvas.height = imageFrame.rows;
|
|
||||||
canvas.width = imageFrame.columns;
|
|
||||||
|
|
||||||
var context = canvas.getContext('2d');
|
|
||||||
var imageData = context.createImageData(imageFrame.columns, imageFrame.rows);
|
|
||||||
cornerstoneWADOImageLoader.convertColorSpace(imageFrame, imageData);
|
|
||||||
imageFrame.imageData = imageData;
|
|
||||||
imageFrame.pixelData = imageData.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup the renderer
|
// Setup the renderer
|
||||||
if(image.color) {
|
if(image.color) {
|
||||||
image.render = cornerstone.renderColorImage;
|
image.render = cornerstone.renderColorImage;
|
||||||
@ -536,7 +535,7 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
{
|
{
|
||||||
if(imageFrame.bitsAllocated === 8)
|
if(imageFrame.bitsAllocated === 8)
|
||||||
{
|
{
|
||||||
return cornerstoneWADOImageLoader.decodeJPEGBaseline8Bit(imageFrame, canvas);
|
return cornerstoneWADOImageLoader.decodeJPEGBaseline8Bit(imageFrame, pixelData, canvas);
|
||||||
} else {
|
} else {
|
||||||
return addDecodeTask(imageFrame, transferSyntax, pixelData, options);
|
return addDecodeTask(imageFrame, transferSyntax, pixelData, options);
|
||||||
}
|
}
|
||||||
@ -625,11 +624,11 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function decodeJPEGBaseline8Bit(imageFrame, canvas) {
|
function decodeJPEGBaseline8Bit(imageFrame, pixelData, canvas) {
|
||||||
var start = new Date().getTime();
|
var start = new Date().getTime();
|
||||||
var deferred = $.Deferred();
|
var deferred = $.Deferred();
|
||||||
|
|
||||||
var imgBlob = new Blob([imageFrame.pixelData], {type: "image/jpeg"});
|
var imgBlob = new Blob([pixelData], {type: "image/jpeg"});
|
||||||
|
|
||||||
var r = new FileReader();
|
var r = new FileReader();
|
||||||
if(r.readAsBinaryString === undefined) {
|
if(r.readAsBinaryString === undefined) {
|
||||||
@ -669,10 +668,10 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
return deferred.promise();
|
return deferred.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
function isJPEGBaseline8Bit(imageFrame) {
|
function isJPEGBaseline8Bit(imageFrame, transferSyntax) {
|
||||||
if((imageFrame.bitsAllocated === 8) &&
|
transferSyntax = transferSyntax || imageFrame.transferSyntax;
|
||||||
imageFrame.transferSyntax === "1.2.840.10008.1.2.4.50")
|
|
||||||
{
|
if((imageFrame.bitsAllocated === 8) && (transferSyntax === "1.2.840.10008.1.2.4.50")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -871,7 +870,7 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
var response = new Uint8Array(imageFrameAsArrayBuffer);
|
var response = new Uint8Array(imageFrameAsArrayBuffer);
|
||||||
|
|
||||||
// First look for the multipart mime header
|
// First look for the multipart mime header
|
||||||
var tokenIndex = cornerstoneWADOImageLoader.wadors.findIndexOfString(response, '\n\r\n');
|
var tokenIndex = cornerstoneWADOImageLoader.wadors.findIndexOfString(response, '\r\n\r\n');
|
||||||
if(tokenIndex === -1) {
|
if(tokenIndex === -1) {
|
||||||
deferred.reject('invalid response - no multipart mime header');
|
deferred.reject('invalid response - no multipart mime header');
|
||||||
}
|
}
|
||||||
@ -882,18 +881,23 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
if(!boundary) {
|
if(!boundary) {
|
||||||
deferred.reject('invalid response - no boundary marker')
|
deferred.reject('invalid response - no boundary marker')
|
||||||
}
|
}
|
||||||
var offset = tokenIndex + 3; // skip over the \n\r\n
|
var offset = tokenIndex + 4; // skip over the \r\n\r\n
|
||||||
|
|
||||||
// find the terminal boundary marker
|
// find the terminal boundary marker
|
||||||
var endIndex = cornerstoneWADOImageLoader.wadors.findIndexOfString(response, boundary, offset);
|
var endIndex = cornerstoneWADOImageLoader.wadors.findIndexOfString(response, boundary, offset);
|
||||||
if(endIndex === -1) {
|
if(endIndex === -1) {
|
||||||
deferred.reject('invalid response - terminating boundary not found');
|
deferred.reject('invalid response - terminating boundary not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove \r\n from the length
|
||||||
|
var length = endIndex - offset - 2;
|
||||||
|
|
||||||
// return the info for this pixel data
|
// return the info for this pixel data
|
||||||
var length = endIndex - offset;
|
|
||||||
deferred.resolve({
|
deferred.resolve({
|
||||||
contentType: findContentType(split),
|
contentType: findContentType(split),
|
||||||
imageFrame: new Uint8Array(imageFrameAsArrayBuffer, offset, length)
|
imageFrame: {
|
||||||
|
pixelData: new Uint8Array(imageFrameAsArrayBuffer, offset, length)
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return deferred.promise();
|
return deferred.promise();
|
||||||
@ -925,7 +929,7 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
|
|
||||||
// TODO: load bulk data items that we might need
|
// TODO: load bulk data items that we might need
|
||||||
|
|
||||||
var mediaType;// = 'image/dicom+jp2';
|
var mediaType = 'multipart/related; type=application/octet-stream'; // 'image/dicom+jp2';
|
||||||
|
|
||||||
// get the pixel data from the server
|
// get the pixel data from the server
|
||||||
cornerstoneWADOImageLoader.wadors.getPixelData(uri, imageId, mediaType).then(function(result) {
|
cornerstoneWADOImageLoader.wadors.getPixelData(uri, imageId, mediaType).then(function(result) {
|
||||||
@ -1096,8 +1100,13 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
planarConfiguration: getValue(metaData['00280006']),
|
planarConfiguration: getValue(metaData['00280006']),
|
||||||
pixelAspectRatio: getValue(metaData['00280034']),
|
pixelAspectRatio: getValue(metaData['00280034']),
|
||||||
smallestPixelValue: getValue(metaData['00280106']),
|
smallestPixelValue: getValue(metaData['00280106']),
|
||||||
largestPixelValue: getValue(metaData['00280107'])
|
largestPixelValue: getValue(metaData['00280107']),
|
||||||
// TODO Color Palette
|
redPaletteColorLookupTableDescriptor: getNumberValues(metaData['00281101']),
|
||||||
|
greenPaletteColorLookupTableDescriptor: getNumberValues(metaData['00281102']),
|
||||||
|
bluePaletteColorLookupTableDescriptor: getNumberValues(metaData['00281103']),
|
||||||
|
redPaletteColorLookupTableData: getNumberValues(metaData['00281201']),
|
||||||
|
greenPaletteColorLookupTableData: getNumberValues(metaData['00281202']),
|
||||||
|
bluePaletteColorLookupTableData: getNumberValues(metaData['00281203'])
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1220,7 +1229,6 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
|
|
||||||
// This uri is not loaded or being loaded, load it via an xhrRequest
|
// This uri is not loaded or being loaded, load it via an xhrRequest
|
||||||
var promise = loadRequest(uri, imageId);
|
var promise = loadRequest(uri, imageId);
|
||||||
promises[uri] = promise;
|
|
||||||
|
|
||||||
// handle success and failure of the XHR request load
|
// handle success and failure of the XHR request load
|
||||||
var loadDeferred = $.Deferred();
|
var loadDeferred = $.Deferred();
|
||||||
@ -1240,6 +1248,8 @@ if(typeof cornerstoneWADOImageLoader === 'undefined'){
|
|||||||
// error thrown, remove the promise
|
// error thrown, remove the promise
|
||||||
delete promises[uri];
|
delete promises[uri];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
promises[uri] = loadDeferred;
|
||||||
return loadDeferred;
|
return loadDeferred;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user