/** * @namespace DICOM related. */ ovm.dicom = ovm.dicom || {}; /** * @class Big Endian reader * @param file */ ovm.dicom.BigEndianReader = function(file) { this.readByteAt = function(i) { return file.charCodeAt(i) & 0xff; }; this.readNumber = function(nBytes, startByte) { var result = 0; for(var i=startByte; istartByte; i--){ result = result * 256 + this.readByteAt(i-1); } return result; }; this.readCouple = function(a,b) { return (a + b*256).toString(16); }; this.readUint16Array = function(nBytes, startByte) { var data = []; for(var i=startByte; i 132: magic word offset = 128; var magicword = metaReader.readString(4, offset); if(magicword !== "DICM") { throw new Error("No magic DICM word found"); } offset += 4; // 0x0002, 0x0000: MetaElementGroupLength var dataElement = this.readDataElement(metaReader, offset); var metaLength = parseInt(dataElement.data, 10); offset += dataElement.offset; // meta elements var metaStart = offset; var metaEnd = offset + metaLength; for( i=metaStart; i error with ffc3 and ffc1 jpeg jfif marker /*var j = new JpegImage(); j.parse(this.pixelBuffer); var d = 0; j.copyToImageData(d); this.pixelBuffer = d.data;*/ } else if( jpeg2000 ) { console.log("JPEG 2000"); // using openjpeg.js from https://github.com/kripken/j2k.js // -> 2 layers results???? /*var data = new Uint16Array(this.pixelBuffer); var result = openjpeg(data, "j2k"); this.pixelBuffer = result.data;*/ // using jpx.js from https://github.com/mozilla/pdf.js // -> ... /*var j = new JpxImage(); j.parse(this.pixelBuffer); console.log("width: "+j.width); console.log("height: "+j.height); console.log("tiles: "+j.tiles.length); console.log("count: "+j.componentsCount); this.pixelBuffer = j.tiles[0].items;*/ } }; /** * Get an Image object from the read DICOM file. * @returns A new Image. */ ovm.dicom.DicomParser.prototype.getImage = function() { // size if( !this.dicomElements.Columns ) { throw new Error("Missing DICOM image number of columns"); } if( !this.dicomElements.Rows ) { throw new Error("Missing DICOM image number of rows"); } var size = new ovm.image.ImageSize( this.dicomElements.Columns.value[0], this.dicomElements.Rows.value[0]); // spacing var rowSpacing = 1; var columnSpacing = 1; if( this.dicomElements.PixelSpacing ) { rowSpacing = parseFloat(this.dicomElements.PixelSpacing.value[0]); columnSpacing = parseFloat(this.dicomElements.PixelSpacing.value[1]); } else if( this.dicomElements.ImagerPixelSpacing ) { rowSpacing = parseFloat(this.dicomElements.ImagerPixelSpacing.value[0]); columnSpacing = parseFloat(this.dicomElements.ImagerPixelSpacing.value[1]); } var spacing = new ovm.image.ImageSpacing( columnSpacing, rowSpacing); // image var image = new ovm.image.Image( size, spacing, this.pixelBuffer ); // lookup var rescaleSlope = 1; if( this.dicomElements.RescaleSlope ) { rescaleSlope = parseFloat(this.dicomElements.RescaleSlope.value[0]); } var rescaleIntercept = 0; if( this.dicomElements.RescaleIntercept ) { rescaleIntercept = parseFloat(this.dicomElements.RescaleIntercept.value[0]); } var windowPresets = []; var name; if( this.dicomElements.WindowCenter && this.dicomElements.WindowWidth ) { for( var i = 0; i < this.dicomElements.WindowCenter.value.length; ++i) { if( this.dicomElements.WindowCenterWidthExplanation ) { name = this.dicomElements.WindowCenterWidthExplanation.value[i]; } else { name = "Default"+i; } windowPresets.push({ "center": parseInt( this.dicomElements.WindowCenter.value[i], 10 ), "width": parseInt( this.dicomElements.WindowWidth.value[i], 10 ), "name": name }); } } var lookup = new ovm.image.LookupTable( windowPresets, rescaleSlope, rescaleIntercept); image.setLookup( lookup ); // return return image; };