J'essaie d'afficher des images Dicom multi-images dans un navigateur en utilisant HTML5 toile et javascript. Jusqu'à présent, je peux très bien rendre les images à cadre unique, mais j'ai des problèmes avec les images multi-cadres.Affichage d'images Dicom multitrames en utilisant HTML5 et canvas
Pour l'analyse du fichier, j'utilise le plugin DicomParser.
Lorsque je casse les données dans ses fragments (images) et essaye de les afficher, le canevas ne fait que restituer des barres de bruit. Voici un exemple de rendu d'une seule image à partir d'une image multi-images.
est Ci-dessous le code 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 ]);
}
}
};
Quelqu'un pourrait-il me dire où je vais mal. Toute information, même générale, serait utile.
L'objectif final est d'utiliser ces images comme textures pour WebGL et Three.js pour créer le rendu volumétrique des images DICOM
Merci d'avoir recommandé ce chargeur d'images, car il semble beaucoup plus robuste que dicomParser. Encore les premiers jours mais je suis plein d'espoir que cela fonctionnera avec webGL/three.js –
Yup, son aspect plutôt bon. Était capable de créer une pile d'image avec relativement peu de problèmes. Vous aviez raison aussi sur l'image étant compressée. –