]> Creatis software - creaImageIO.git/blob - src2/creaImageIORFImageReader.cpp
886db787ef4cc66ce15a0d6320f02cf4d0f51d47
[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         fclose(rf_file);
65       }
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     std::cout << "NewVtkImageDataFromRaw" << std::endl;
96     vtkImageData* im = crea::NewVtkImageDataFromRaw( data,
97                                                      h.width,
98                                                      h.height,
99                                                      h.frame);
100     
101      std::cout << "OK" << std::endl;
102     
103   }
104   //=====================================================================
105   
106  
107   //=====================================================================
108   void RFImageReader::PushBackExtensions(std::vector<std::string>& v)
109   {
110     v.push_back("rf");
111   }
112   //=====================================================================
113  
114
115
116   //=====================================================================
117   void RFImageReader::ReadAttributes(const std::string& filename, 
118                                       std::map<std::string,std::string>& attr)
119   {
120     //      std::cout << "RFImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
121     GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
122  
123
124     FILE *rf_file=fopen(filename.c_str(),"rb");
125     if (!rf_file) return;
126     rf_header h;
127     if (!ReadHeader(rf_file,h)) 
128       {
129         fclose(rf_file);  
130         return;
131       }
132     fclose(rf_file);  
133   
134     // Columns
135     char cols[128];
136     sprintf(cols,"%i",h.width);
137     // Rows
138     char rows[128];
139     sprintf(rows,"%i",h.height);
140     // Planes 
141     char planes[128];
142     sprintf(planes,"%i",h.frame);
143     
144     
145     // 
146     std::map<std::string,std::string>::iterator i;
147     if ( (i = attr.find("FullFileName")) != attr.end())
148       {
149         //        boost::filesystem::path full_path(filename);
150         // std::string f = full_path.leaf();
151         i->second = filename;
152       }
153     if ( (i = attr.find("D0004_1500")) != attr.end())
154       {
155         boost::filesystem::path full_path(filename);
156         std::string f = full_path.leaf();
157         i->second = f;
158       }
159     if ( (i = attr.find("D0028_0010")) != attr.end())
160       {
161         i->second = rows;
162       }
163     if ( (i = attr.find("D0028_0011")) != attr.end())
164       {
165         i->second = cols;
166       }
167     
168     if ( (i = attr.find("D0028_0012")) != attr.end())
169       {
170         i->second = planes;
171       }
172     
173    GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
174   }
175   //=====================================================================
176
177 } // namespace creaImageIO