]> Creatis software - creaImageIO.git/blob - src2/creaImageIORFImageReader.cpp
Fixed Bugs with filter. Added Layer Diagram to documentation.
[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     FILE *rf_file=fopen(filename.c_str(),"rb");
65     if (!rf_file) return false;
66     rf_header h;
67     if (!ReadHeader(rf_file,h)) 
68       {
69         fclose(rf_file);  
70         return 0;
71       }
72     
73     long im_size = h.height * h.width * h.frame;
74     short* data = (short*)malloc(sizeof(short)*im_size);
75
76     long frame_size = h.height * h.width * sizeof(short);
77     short* ptr = data;
78     for (int k=0; k<h.frame; k++) {
79       int frame_number;
80       fread(&frame_number,sizeof(int),1,rf_file);
81       fread(ptr,sizeof(short),frame_size,rf_file);
82       ptr += frame_size;
83     }
84     fclose(rf_file);  
85
86     //    std::cout << "NewVtkImageDataFromRaw" << std::endl;
87     vtkImageData* im = crea::NewVtkImageDataFromRaw( data,
88                                                      h.width,
89                                                      h.height,
90                                                      h.frame);
91     
92     return im;
93
94     //    std::cout << "OK" << std::endl;
95     
96   }
97   //=====================================================================
98   
99  
100   //=====================================================================
101   void RFImageReader::PushBackExtensions(std::vector<std::string>& v)
102   {
103     v.push_back("rf");
104   }
105   //=====================================================================
106  
107
108
109   //=====================================================================
110   void RFImageReader::ReadAttributes(const std::string& filename, 
111                                       std::map<std::string,std::string>& attr)
112   {
113     //      std::cout << "RFImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
114     GimmickMessage(2,"Reading attributes from '"<<filename<<std::endl);
115  
116
117     FILE *rf_file=fopen(filename.c_str(),"rb");
118     if (!rf_file) return;
119     rf_header h;
120     if (!ReadHeader(rf_file,h)) 
121       {
122         fclose(rf_file);  
123         return;
124       }
125     fclose(rf_file);  
126   
127     // Columns
128     char cols[128];
129     sprintf(cols,"%i",h.width);
130     // Rows
131     char rows[128];
132     sprintf(rows,"%i",h.height);
133     // Planes 
134     char planes[128];
135     sprintf(planes,"%i",h.frame);
136     
137     
138     // 
139     std::map<std::string,std::string>::iterator i;
140     if ( (i = attr.find("FullFileName")) != attr.end())
141       {
142         //        boost::filesystem::path full_path(filename);
143         // std::string f = full_path.leaf();
144         i->second = filename;
145       }
146     if ( (i = attr.find("D0004_1500")) != attr.end())
147       {
148         boost::filesystem::path full_path(filename);
149         std::string f = full_path.leaf();
150         i->second = f;
151       }
152     if ( (i = attr.find("D0028_0010")) != attr.end())
153       {
154         i->second = rows;
155       }
156     if ( (i = attr.find("D0028_0011")) != attr.end())
157       {
158         i->second = cols;
159       }
160     
161     if ( (i = attr.find("D0028_0012")) != attr.end())
162       {
163         i->second = planes;
164       }
165     
166    GimmickMessage(2,"Attributes map:"<<std::endl<<attr<<std::endl);
167   }
168   //=====================================================================
169
170 } // namespace creaImageIO