我正在尝试使用HTML5 canvas和javascript在浏览器中显示多帧dicom图像。到目前为止,我可以渲染单帧图像,但我遇到了多帧图像的问题。
为解析文件,我正在使用DicomParser插件。
当我将数据分解为碎片(帧)并尝试显示它们时,画布只会渲染噪声条。下面是从多帧图像渲染单个帧的示例。
以下是javscript代码
// CREATE A CANVAS REFERENCE
// -------------------------------------------------------------------------------------------------
var canvas = document.getElementById( 'canvas' );
canvas.with = 200;
canvas.height = 200;
// ADD A HANDLER FOR READING FILES FROM COMPUTER
// -------------------------------------------------------------------------------------------------
var dicomFile = document.getElementById( 'dicomfile' );
dicomFile.onchange = function( evt ) {
var tgt = evt.target || window.event.srcElement,
files = tgt.files;
// FILEREADER SUPPORT
// ---------------------------------------------------------------------------------------------
if ( FileReader && files && files.length ) {
var fr = new FileReader(),
extension = files[ 0 ].name.split( '.' ).pop().toLowerCase();
// IF EXTENSION IS NOT DCM ,THEN STOP PROCESSING FURTHER AND EXIT.
if ( extension !== 'dcm' ) {
alert( 'please choose a Dicom file' );
return;
} else {
// PARSE AND PROCESS THE DICOM FILE.
fr.onload = function( e ) {
var dicomArray = new Uint8Array( e.target.result ),
// PARSE THE DICOM FILE
dataSet = dicomParser.parseDicom( dicomArray ),
// GET WIDTH AND HEIGHT OF THE DICOM IMAGE.
width = dataSet.uint16( 'x00280011' ), height = dataSet.uint16( 'x00280010' ),
// GET THE PIXEL DATA ELEMENT FROM THE DATASET.
pixelDataElement = dataSet.elements.x7fe00010;
// NOW GET THE PIXEL DATA FROM THE DICOM FILE.
var pixelData = [];
pixelDataElement.basicOffsetTable.forEach( function(offset){
pixelDataElement.fragments.forEach(function(fragment){
pixelData.push( new Uint8Array( dataSet.byteArray.buffer, offset, fragment.length ) );
});
});
// NOW WE HAVE GOT WIDTH, HEIGHT AND PIXEL DATA WHICH IS ALL IT TAKES TO RENDER A IMAGE TO THE CANVAS.
canvas.width = width;
canvas.height = height;
// GET CONTEXT
var context = canvas.getContext( '2d' ),
// GET IMAGE DATA TO UPDATE
imageData = context.getImageData( 0, 0, width, height ),
data = imageData.data;
// UPDATING ALPHA
for ( var i = 3, k = 0; i < data.byteLength; i = i + 4, k = k + 2 ) {
// CONVERT 16-BIT TO 8-BIT ,BECAUSE WE CANNOT RENDER A 16-BIT VALUE TO THE CANVAS.
var result = ((pixelData[0][ k + 1 ] & 0xFF) << 8) | (pixelData[0][ k ] & 0xFF);
result = (result & 0xFFFF) >> 8;
data[ i ] = 255 - result;
}
imageData[0] = data[0];
context.putImageData( imageData, 0, 0 );
// SHOW THE CANVAS
canvas.style.display = 'block';
};
fr.readAsArrayBuffer( this.files[ 0 ] );
}
}
};
有谁能告诉我哪里出错了。任何信息,无论多么通用,都会有所帮助。
最终目标是将这些帧用作webGl和three.js的纹理,以创建dicom图像的体积渲染
答案 0 :(得分:3)
多帧文件中的图像帧可能已压缩,而dicomParser不包含解压缩代码。查看CornerstoneWADOImageLoader以获取编解码器以及如何使用它们: https://github.com/chafey/cornerstoneWADOImageLoader