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