]> Creatis software - gdcm.git/blob - vtk/Bmp2Dcm.cxx
ca92633dec7c8325ffbb57db402ea6b4bc40b489
[gdcm.git] / vtk / Bmp2Dcm.cxx
1 /*=========================================================================\r
2                                                                                 \r
3   Program:   gdcm\r
4   Module:    $RCSfile: Bmp2Dcm.cxx,v $\r
5   Language:  C++\r
6   Date:      $Date: 2007/06/27 08:43:25 $\r
7   Version:   $Revision: 1.2 $\r
8                                                                                 \r
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de\r
10   l'Image). All rights reserved. See Doc/License.txt or\r
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.\r
12                                                                                 \r
13      This software is distributed WITHOUT ANY WARRANTY; without even\r
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
15      PURPOSE.  See the above copyright notices for more information.\r
16                                                                                 \r
17 =========================================================================*/\r
18 \r
19 #include "gdcmArgMgr.h"\r
20 #include "gdcmDirList.h"\r
21 #include "gdcmDebug.h"\r
22 #include "gdcmUtil.h"\r
23 \r
24 #include <vtkImageData.h>\r
25 \r
26 #include <vtkBMPReader.h>\r
27 #include <vtkBMPWriter.h>\r
28 #include "vtkGdcmWriter.h"\r
29 \r
30 #include <vtkImageExtractComponents.h>\r
31 #include <vtkPointData.h>\r
32 #include <vtkDataArray.h>\r
33 \r
34 #include <stdio.h>\r
35 #include <string.h>\r
36 #include <stdlib.h>\r
37 #include <math.h>\r
38 \r
39 //---------------------------------------------------------------------------\r
40 \r
41 int main( int argc, char *argv[] )\r
42 {\r
43    START_USAGE(usage)\r
44    "\n Bmp2Dcm :\n                                                            ",  \r
45    "usage: Bmp2Dcm {filein=inputFileName|dirin=inputDirectoryName}            ",\r
46    "              [studyUID = ] [patName = ] [debug]                          ", \r
47    "                                                                          ",\r
48    " inputFileName : Name of the (single) file user wants to transform        ",\r
49    " inputDirectoryName : user wants to transform *all* the files             ",\r
50    " studyUID   : *aware* user wants to add the serie                         ",\r
51    "                                             to an already existing study ", \r
52    " verbose    : user wants to run the program in 'verbose mode'             ",       \r
53    " debug      : *developper* wants to run the program in 'debug mode'       ",\r
54    \r
55    FINISH_USAGE\r
56 \r
57    // ----- Initialize Arguments Manager ------\r
58   \r
59    GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);\r
60   \r
61    if (am->ArgMgrDefined("usage") || argc == 1) \r
62    {\r
63       am->ArgMgrUsage(usage); // Display 'usage'\r
64       delete am;\r
65       return 0;\r
66    }\r
67 \r
68    if (am->ArgMgrDefined("debug"))\r
69       GDCM_NAME_SPACE::Debug::DebugOn();\r
70       \r
71    int verbose  = am->ArgMgrDefined("verbose");\r
72          \r
73    const char *fileName = am->ArgMgrGetString("filein");\r
74    const char *dirName  = am->ArgMgrGetString("dirin");\r
75 \r
76    if ( (fileName == 0 && dirName == 0)\r
77         ||\r
78         (fileName != 0 && dirName != 0) )\r
79    {\r
80        std::cout <<std::endl\r
81                  << "Either 'filein=' or 'dirin=' must be present;" \r
82                  << std::endl << "Not both" << std::endl;\r
83        am->ArgMgrUsage(usage); // Display 'usage'  \r
84        delete am;\r
85        return 0;\r
86  }\r
87  \r
88    std::string patName  = am->ArgMgrGetString("patname", dirName);\r
89     \r
90    bool userDefinedStudy = am->ArgMgrDefined("studyUID");\r
91    const char *studyUID;\r
92    if (userDefinedStudy)\r
93       studyUID  = am->ArgMgrGetString("studyUID");  \r
94 \r
95    // not described *on purpose* in the Usage !    \r
96    bool userDefinedSerie = am->ArgMgrDefined("serieUID");   \r
97    const char *serieUID;\r
98    if(userDefinedSerie)\r
99       serieUID = am->ArgMgrGetString("serieUID");\r
100        \r
101     /* if unused Param we give up */\r
102    if ( am->ArgMgrPrintUnusedLabels() )\r
103    {\r
104       am->ArgMgrUsage(usage);\r
105       delete am;\r
106       return 0;\r
107    } \r
108  \r
109    delete am;  // ------ we don't need Arguments Manager any longer ------\r
110 \r
111 \r
112    // ----- Begin Processing -----\r
113    \r
114    int *dim;\r
115    std::string nomFich;\r
116    \r
117    if ( fileName != 0 ) // ====== Deal with a single file ======\r
118    { \r
119      vtkBMPReader* Reader = vtkBMPReader::New();\r
120      if ( Reader->CanReadFile(fileName ) == 0) {\r
121          // skip 'non BMP' files   \r
122         Reader->Delete();\r
123         if (verbose)\r
124             std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;\r
125         return 0;\r
126     }\r
127     \r
128     if (verbose)\r
129        std::cout << "deal with [" <<  fileName << "]" << std::endl;\r
130      //Read BMP file\r
131 \r
132      Reader->SetFileName(fileName);\r
133      Reader->Update();\r
134 \r
135      vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
136      Red->SetInput(Reader->GetOutput());\r
137      Red->SetComponents(0);\r
138      Red->Update();\r
139 \r
140      vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
141      Writer->SetInput(Red->GetOutput());\r
142      nomFich = "";\r
143      nomFich = nomFich+fileName+".acr";   \r
144      Writer->Write();\r
145    \r
146      Reader->Delete();\r
147      Red->Delete();\r
148      Writer->Delete();\r
149    \r
150      }\r
151      else  // ====== Deal with a (single Patient) Directory ======\r
152      { \r
153      \r
154         if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirName) )\r
155         {\r
156           std::cout << "KO : [" << dirName << "] is not a Directory." << std::endl;\r
157           return 0;\r
158         }\r
159         else\r
160         {\r
161           if (verbose)\r
162             std::cout << "OK : [" << dirName << "] is a Directory." << std::endl;\r
163         } \r
164         std::string strStudyUID;\r
165         std::string strSerieUID;\r
166 \r
167         if (userDefinedStudy)\r
168            strSerieUID =  studyUID;\r
169         else\r
170            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();\r
171    \r
172         if (userDefinedStudy)\r
173           strSerieUID =  serieUID;\r
174         else\r
175            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();    \r
176 \r
177        if(verbose)\r
178            std::cout << "dirName [" << dirName << "]" << std::endl;\r
179        \r
180         GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list\r
181         GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();\r
182 \r
183         for( GDCM_NAME_SPACE::DirListType::iterator it  = fileList.begin();\r
184                                    it != fileList.end();\r
185                                    ++it )\r
186         {\r
187            if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' ) \r
188            {\r
189               // skip hidden files\r
190               continue;\r
191            }\r
192       \r
193            vtkBMPReader* Reader = vtkBMPReader::New();\r
194   \r
195            if ( Reader->CanReadFile(it->c_str() ) == 0) {\r
196               // skip 'non BMP' files  \r
197                Reader->Delete();\r
198                continue;\r
199             }\r
200    \r
201            if (verbose)\r
202              std::cout << "deal with [" <<  it->c_str() << "]" << std::endl;  \r
203    \r
204            Reader->SetFileName(it->c_str());    \r
205            Reader->Update();\r
206    \r
207            dim=Reader->GetOutput()->GetDimensions();\r
208            vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
209            Red->SetInput(Reader->GetOutput());\r
210            Red->SetComponents(0);\r
211            Red->Update();\r
212 \r
213            // At least, created files will look like a Serie from a single Study ...  \r
214            GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();\r
215            f->InsertEntryString(strStudyUID, 0x0020, 0x000d, "UI");      \r
216            f->InsertEntryString(strSerieUID, 0x0020, 0x000e, "UI");\r
217            f->InsertEntryString(patName,     0x0010, 0x0010, "PN");   // Patient's Name \r
218 \r
219            vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
220            Writer->SetInput(Red->GetOutput());\r
221            nomFich = "";\r
222            nomFich = nomFich+it->c_str()+".acr";\r
223            Writer->SetFileName(nomFich.c_str());\r
224            Writer->SetGdcmFile(f);\r
225            Writer->Write();\r
226    \r
227            f->Delete(); \r
228         \r
229       }\r
230    }   \r
231    return 0;   \r
232 }\r