]> Creatis software - creaImageIO.git/commitdiff
Added ultrasonix RF image support
authorguigues <guigues>
Mon, 23 Feb 2009 14:33:56 +0000 (14:33 +0000)
committerguigues <guigues>
Mon, 23 Feb 2009 14:33:56 +0000 (14:33 +0000)
src2/CMakeLists.txt
src2/creaImageIOImageReader.cpp
src2/creaImageIORFImageReader.cpp [new file with mode: 0644]
src2/creaImageIORFImageReader.h [new file with mode: 0644]

index 29c67a1828a558257da3139b9da797056c529938..777742b48e458be1f5f9f636dc59605c2e5785c0 100644 (file)
@@ -20,6 +20,7 @@ SET( SRCS
   creaImageIOAbstractImageReader
   creaImageIOVtkImageReader
   creaImageIODicomImageReader
+  creaImageIORFImageReader
   creaImageIOImageReader
   creaImageIOMultiThreadImageReader
 
index 96dec5977e7b941304f8262656b8d5b4d1dd4e47..6ac29f6b733e6986125c90a807243596de8542d7 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <creaImageIOVtkImageReader.h>
 #include <creaImageIODicomImageReader.h>
+#include <creaImageIORFImageReader.h>
 
 #include <vtkPNGReader.h>
 #include <vtkTIFFReader.h>
@@ -43,6 +44,7 @@ namespace creaImageIO
     Register(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd"));
     //   Register(new VtkImageReader(vtkGESignalReader::New()));
     Register(new DicomImageReader);
+    Register(new RFImageReader);
 
     /*
     std::cout << "## Registered file extensions : "<<std::endl;
diff --git a/src2/creaImageIORFImageReader.cpp b/src2/creaImageIORFImageReader.cpp
new file mode 100644 (file)
index 0000000..5c7aec2
--- /dev/null
@@ -0,0 +1,173 @@
+#include <creaImageIORFImageReader.h>
+#include <creaVtk.h>
+#include <creaImageIOSystem.h>
+#include "boost/filesystem/path.hpp"
+
+namespace creaImageIO
+{
+#define HEADER_SIZE 19
+
+  void read_header_rf_file(FILE *rf_file,int *w,int *h,int *n_frame) 
+  {
+    int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+    fread(header,sizeof(int),HEADER_SIZE,rf_file);
+    *n_frame=header[1];
+    *w=header[2];
+    *h=header[3];
+    free(header);
+  }
+
+  //=====================================================================
+  RFImageReader::RFImageReader()
+  {
+    SetName("rf");
+  }
+  //=====================================================================
+  
+  //=====================================================================
+  RFImageReader::~RFImageReader()
+  {
+  }
+  //=====================================================================
+
+  //=====================================================================
+  struct rf_header
+  {
+    // frames, width, height
+    int frame,width,height;
+  };
+  //=====================================================================
+
+
+  //=====================================================================
+  bool ReadHeader( FILE *rf_file, rf_header& h )
+  {
+    int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
+    fread(header,sizeof(int),HEADER_SIZE,rf_file);
+    h.frame = header[1];
+    h.width = header[2];
+    h.height = header[3];
+    free(header);  
+    return true;
+  }
+  //=====================================================================
+
+  //=====================================================================
+  bool RFImageReader::CanRead(const std::string& filename)
+  { 
+    bool ok = false;
+    FILE *rf_file=fopen(filename.c_str(),"rb");
+    if (rf_file) 
+      {
+       rf_header h;
+       ok = ReadHeader(rf_file,h);
+      }
+    fclose(rf_file);
+    return ok;
+  }
+  //=====================================================================
+  
+  //=====================================================================
+  vtkImageData* RFImageReader::ReadImage(const std::string& filename)
+  {
+    FILE *rf_file=fopen(filename.c_str(),"rb");
+    if (!rf_file) return false;
+    rf_header h;
+    if (!ReadHeader(rf_file,h)) 
+      {
+        fclose(rf_file);  
+       return 0;
+      }
+    
+    long im_size = h.height * h.width * h.frame;
+    short* data = (short*)malloc(sizeof(short)*im_size);
+
+    long frame_size = h.height * h.width * sizeof(short);
+    short* ptr = data;
+    for (int k=0; k<h.frame; k++) {
+      int frame_number;
+      fread(&frame_number,sizeof(int),1,rf_file);
+      fread(ptr,sizeof(short),frame_size,rf_file);
+      ptr += frame_size;
+    }
+    fclose(rf_file);  
+
+
+    return crea::NewVtkImageDataFromRaw( data,
+                                        im_size);
+    
+  }
+  //=====================================================================
+  
+  //=====================================================================
+  void RFImageReader::PushBackExtensions(std::vector<std::string>& v)
+  {
+    v.push_back("rf");
+  }
+  //=====================================================================
+
+
+  //=====================================================================
+  void RFImageReader::ReadAttributes(const std::string& filename, 
+                                     std::map<std::string,std::string>& attr)
+  {
+    //      std::cout << "RFImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
+    GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
+
+    FILE *rf_file=fopen(filename.c_str(),"rb");
+    if (!rf_file) return;
+    rf_header h;
+    if (!ReadHeader(rf_file,h)) 
+      {
+        fclose(rf_file);  
+       return;
+      }
+    fclose(rf_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);
+    
+    
+    // 
+    std::map<std::string,std::string>::iterator i;
+    if ( (i = attr.find("FullFileName")) != attr.end())
+      {
+       //        boost::filesystem::path full_path(filename);
+       // std::string f = full_path.leaf();
+       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;
+      }
+    
+   GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
+  }
+  //=====================================================================
+
+} // namespace creaImageIO
diff --git a/src2/creaImageIORFImageReader.h b/src2/creaImageIORFImageReader.h
new file mode 100644 (file)
index 0000000..f4a422e
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef __creaImageIORFImageReader_h_INCLUDED__
+#define __creaImageIORFImageReader_h_INCLUDED__
+
+
+#include <creaImageIOAbstractImageReader.h>
+
+
+namespace creaImageIO
+{
+
+
+  /**
+   * \ingroup IO
+   */
+  
+  //=====================================================================
+  /// Concrete image reader for ultrasonix 'rf' files
+  class RFImageReader : virtual public AbstractImageReader
+  {
+  public:
+    RFImageReader();
+
+    virtual ~RFImageReader();
+
+    virtual void PushBackExtensions(std::vector<std::string>&);
+    virtual bool CanRead(const std::string& filename);
+    virtual vtkImageData* ReadImage(const std::string& filename);
+    virtual void ReadAttributes(const std::string& filename, 
+                               tree::AttributeMapType& attr);
+
+  };
+  //=====================================================================
+
+
+
+} // namespace creaImageIO
+
+
+
+#endif // #ifndef __creaImageIORFImageReader_h_INCLUDED__