]> Creatis software - creaImageIO.git/blob - src2/creaImageIORFImageReader.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIORFImageReader.cpp
1 #include <creaImageIORFImageReader.h>
2 #include <creaVtk.h>
3 #include <creaImageIOSystem.h>
4 #include "boost/filesystem/path.hpp"
5
6 namespace creaImageIO
7 {
8 #define HEADER_SIZE 19
9
10   void read_header_rf_file(FILE *rf_file,int *w,int *h,int *n_frame) 
11   {
12     int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
13     fread(header,sizeof(int),HEADER_SIZE,rf_file);
14     *n_frame=header[1];
15     *w=header[2];
16     *h=header[3];
17     free(header);
18   }
19
20   //=====================================================================
21   RFImageReader::RFImageReader()
22   {
23     SetName("rf");
24   }
25   //=====================================================================
26   
27   //=====================================================================
28   RFImageReader::~RFImageReader()
29   {
30   }
31   //=====================================================================
32
33   //=====================================================================
34   struct rf_header
35   {
36     // frames, width, height
37     int frame,width,height;
38   };
39   //=====================================================================
40
41
42   //=====================================================================
43   bool ReadHeader( FILE *rf_file, rf_header& h )
44   {
45     int *header=(int*)malloc(sizeof(int)*HEADER_SIZE);
46     fread(header,sizeof(int),HEADER_SIZE,rf_file);
47     h.frame = header[1];
48     h.width = header[2];
49     h.height = header[3];
50     free(header);  
51     return true;
52   }
53   //=====================================================================
54
55   //=====================================================================
56   bool RFImageReader::CanRead(const std::string& filename)
57   { 
58     bool ok = false;
59     FILE *rf_file=fopen(filename.c_str(),"rb");
60     if (rf_file) 
61       {
62         rf_header h;
63         ok = ReadHeader(rf_file,h);
64       }
65     fclose(rf_file);
66     return ok;
67   }
68   //=====================================================================
69   
70   //=====================================================================
71   vtkImageData* RFImageReader::ReadImage(const std::string& filename)
72   {
73     FILE *rf_file=fopen(filename.c_str(),"rb");
74     if (!rf_file) return false;
75     rf_header h;
76     if (!ReadHeader(rf_file,h)) 
77       {
78         fclose(rf_file);  
79         return 0;
80       }
81     
82     long im_size = h.height * h.width * h.frame;
83     short* data = (short*)malloc(sizeof(short)*im_size);
84
85     long frame_size = h.height * h.width * sizeof(short);
86     short* ptr = data;
87     for (int k=0; k<h.frame; k++) {
88       int frame_number;
89       fread(&frame_number,sizeof(int),1,rf_file);
90       fread(ptr,sizeof(short),frame_size,rf_file);
91       ptr += frame_size;
92     }
93     fclose(rf_file);  
94
95
96     return crea::NewVtkImageDataFromRaw( data,
97                                          im_size);
98     
99   }
100   //=====================================================================
101   
102  
103   //=====================================================================
104   void RFImageReader::PushBackExtensions(std::vector<std::string>& v)
105   {
106     v.push_back("rf");
107   }
108   //=====================================================================
109  
110
111
112   //=====================================================================
113   void RFImageReader::ReadAttributes(const std::string& filename, 
114                                       std::map<std::string,std::string>& attr)
115   {
116     //      std::cout << "RFImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
117     GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
118  
119
120     FILE *rf_file=fopen(filename.c_str(),"rb");
121     if (!rf_file) return;
122     rf_header h;
123     if (!ReadHeader(rf_file,h)) 
124       {
125         fclose(rf_file);  
126         return;
127       }
128     fclose(rf_file);  
129   
130     // Columns
131     char cols[128];
132     sprintf(cols,"%i",h.width);
133     // Rows
134     char rows[128];
135     sprintf(rows,"%i",h.height);
136     // Planes 
137     char planes[128];
138     sprintf(planes,"%i",h.frame);
139     
140     
141     // 
142     std::map<std::string,std::string>::iterator i;
143     if ( (i = attr.find("FullFileName")) != attr.end())
144       {
145         //        boost::filesystem::path full_path(filename);
146         // std::string f = full_path.leaf();
147         i->second = filename;
148       }
149     if ( (i = attr.find("D0004_1500")) != attr.end())
150       {
151         boost::filesystem::path full_path(filename);
152         std::string f = full_path.leaf();
153         i->second = f;
154       }
155     if ( (i = attr.find("D0028_0010")) != attr.end())
156       {
157         i->second = rows;
158       }
159     if ( (i = attr.find("D0028_0011")) != attr.end())
160       {
161         i->second = cols;
162       }
163     
164     if ( (i = attr.find("D0028_0012")) != attr.end())
165       {
166         i->second = planes;
167       }
168     
169    GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
170   }
171   //=====================================================================
172
173 } // namespace creaImageIO