--- /dev/null
+
+#include "creaImageIOSystem.h"
+#include "creaImageIOUltrasonixImageReader.h"
+#include <creaVtk.h>
+#include <boost/filesystem/path.hpp>
+namespace creaImageIO
+{
+#define HEADER_SIZE 19
+#define TYPE_RF 16
+#define TYPE_B8 4
+#define TYPE_B32 8
+
+
+ //=====================================================================
+ UltrasonixImageReader::UltrasonixImageReader()
+ {
+ SetName("Ultrasonix");
+ }
+ //=====================================================================
+
+ //=====================================================================
+ UltrasonixImageReader::~UltrasonixImageReader()
+ {
+ }
+ //=====================================================================
+
+ //=====================================================================
+ struct Ultrasonix_header
+ {
+ // frames, width, height, ultrasounds frequency, sampling rate
+ int type, frame, width, height, frequency, samplingRate;
+ };
+ //=====================================================================
+
+
+ //=====================================================================
+ bool ReadHeader( FILE *Ultrasonix_file, Ultrasonix_header& h )
+ {
+ //int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+ int header[HEADER_SIZE];
+ fread(header, sizeof(int), HEADER_SIZE, Ultrasonix_file);
+ if (ferror(Ultrasonix_file))
+ return false;
+ h.type = header[0];
+ h.frame = header[1];
+ h.height = header[2];
+ h.width = header[3];
+ h.frequency = header[14];
+ h.samplingRate = header[15];
+ //free(header);
+ return true;
+ }
+ //=====================================================================
+
+ //=====================================================================
+ bool UltrasonixImageReader::CanRead(const std::string& filename)
+ {
+ long size;
+ bool ok = false;
+ FILE *Ultrasonix_file=fopen(filename.c_str(), "rb");
+ if (Ultrasonix_file)
+ {
+ Ultrasonix_header h;
+ if (!ReadHeader(Ultrasonix_file, h) )
+ {
+ fclose(Ultrasonix_file);
+ std::cout << "cannot read Ultrasonix header for file [" << filename << "]" << std::endl;
+ return false;
+ }
+
+ fseek(Ultrasonix_file,0,SEEK_END); // go to end of file
+ if (h.type == TYPE_RF)
+ size = (ftell(Ultrasonix_file) - (HEADER_SIZE+h.frame) * sizeof(int)) / sizeof(short);
+ else if (h.type == TYPE_B8)
+ size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(char);
+ else if (h.type == TYPE_B32)
+ size = (ftell(Ultrasonix_file) - HEADER_SIZE * sizeof(int)) / sizeof(int);
+
+ // check if the data size corresponds to the dimensions of the images
+ if (size == h.width * h.height * h.frame)
+ ok = true;
+
+ fclose(Ultrasonix_file);
+ }
+ return ok;
+ }
+ //=====================================================================
+
+ //=====================================================================
+ vtkImageData* UltrasonixImageReader::ReadImage(const std::string& filename)
+ {
+ FILE *Ultrasonix_file=fopen(filename.c_str(),"rb");
+ if (!Ultrasonix_file)
+ {
+ std::cout << "cannot open file [" << filename << "]" << std::endl;
+ return 0;
+ }
+ Ultrasonix_header h;
+ if (!ReadHeader(Ultrasonix_file,h))
+ {
+ std::cout << "cannot read Ultrasonix header for file [" << filename << "]" << std::endl;
+ fclose(Ultrasonix_file);
+ return 0;
+ }
+
+ long frame_size = h.height * h.width;
+ long im_size = frame_size * h.frame;
+
+ short *dataRF, *ptrRF;
+ char *dataB8, *ptrB8;
+ int *dataB32, *ptrB32;
+ vtkImageData* im;
+ int temp;
+
+ switch (h.type)
+ {
+ case TYPE_RF:
+ dataRF = (short*)malloc(sizeof(short)*im_size);
+ ptrRF = dataRF;
+
+ for (int k=0; k<h.frame; k++)
+ {
+ int frame_number;
+ fread(&frame_number, sizeof(int), 1, Ultrasonix_file);
+ fread(ptrRF,sizeof(short), frame_size, Ultrasonix_file);
+ ptrRF += frame_size;
+ }
+ fclose(Ultrasonix_file);
+
+ im = crea::NewVtkImageDataFromRaw( dataRF, h.width, h.height, h.frame);
+ break;
+
+ case TYPE_B8:
+ dataB8 = (char*)malloc(sizeof(char)*im_size);
+ ptrB8 = dataB8;
+ for (int k=0; k<h.frame; k++)
+ {
+ fread(ptrB8,sizeof(char), frame_size, Ultrasonix_file);
+ ptrB8 += frame_size;
+ }
+ // in mode b frames width and height are inverted
+ temp = h.width;
+ h.width = h.height;
+ h.height = temp;
+
+ fclose(Ultrasonix_file);
+
+ im = crea::NewVtkImageDataFromRaw( dataB8, h.width, h.height, h.frame);
+ break;
+
+ case TYPE_B32:
+ dataB32 = (int*)malloc(sizeof(int)*im_size);
+ ptrB32 = dataB32;
+ for (int k=0; k<h.frame; k++)
+ {
+ fread(ptrB32, sizeof(int), frame_size, Ultrasonix_file);
+ ptrB32 += frame_size;
+ }
+ // in B mode frames width and height are inverted
+ temp = h.width;
+ h.width = h.height;
+ h.height = temp;
+
+ fclose(Ultrasonix_file);
+
+ im = crea::NewVtkImageDataFromRaw( dataB32, h.width, h.height, h.frame);
+ break;
+ }
+
+ return im;
+}
+ //=====================================================================
+
+
+ //=====================================================================
+ void UltrasonixImageReader::PushBackExtensions(std::vector<std::string>& v)
+ {
+ v.push_back("Ultrasonix");
+ }
+ //=====================================================================
+
+
+
+ //=====================================================================
+ void UltrasonixImageReader::ReadAttributes(const std::string& filename,
+ std::map<std::string,std::string>& attr)
+ {
+ GimmickMessage(2,"Reading attributes from '" << filename << std::endl);
+
+ FILE *Ultrasonix_file = fopen(filename.c_str(), "rb");
+ if (!Ultrasonix_file)
+ {
+ std::cout << "cannot open RF file [" << filename << "]" << std::endl;
+ return;
+ }
+
+ Ultrasonix_header h;
+ if (!ReadHeader(Ultrasonix_file, h))
+ {
+ fclose(Ultrasonix_file);
+ std::cout << "cannot read Ultrasonix Attributes for RF file [" << filename << "]" << std::endl;
+ return;
+ }
+
+ fclose(Ultrasonix_file);
+
+ // Columns
+ char cols[128];
+ sprintf(cols,"%i", h.width);
+ // Rows
+ char rows[128];
+ sprintf(rows,"%i", h.height);
+ // Planes
+ char planes[128];
+ sprintf(planes,"%i", h.frame);
+ // Sampling frequency
+ char samplingFrequency[128];
+ sprintf(samplingFrequency,"%i", h.samplingRate);
+ // Transducer frequency
+ char transducerFrequency[128];
+ sprintf(transducerFrequency,"%i", h.frequency);
+
+ //
+ std::map<std::string,std::string>::iterator i;
+ if ( (i = attr.find("FullFileName")) != attr.end())
+ {
+ i->second = filename;
+ }
+ if ( (i = attr.find("D0004_1500")) != attr.end())
+ {
+ boost::filesystem::path full_path(filename);
+ std::string f = full_path.leaf();
+ i->second = f;
+ }
+ if ( (i = attr.find("D0028_0010")) != attr.end())
+ {
+ i->second = rows;
+ }
+ if ( (i = attr.find("D0028_0011")) != attr.end())
+ {
+ i->second = cols;
+ }
+ if ( (i = attr.find("D0028_0012")) != attr.end())
+ {
+ i->second = planes;
+ }
+ if ( (i = attr.find("D003a_001a")) != attr.end())
+ {
+ i->second = samplingFrequency;
+ }
+ if ( (i = attr.find("D0018_6030")) != attr.end())
+ {
+ i->second = transducerFrequency;
+ }
+
+ GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
+ return;
+}
+ //=====================================================================
+
+} // namespace creaImageIO