1 /*=========================================================================
\r
4 Module: $RCSfile: Bmp2Dcm.cxx,v $
\r
6 Date: $Date: 2007/10/30 16:42:58 $
\r
7 Version: $Revision: 1.3 $
\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
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
17 =========================================================================*/
\r
19 #include "gdcmArgMgr.h"
\r
20 #include "gdcmDirList.h"
\r
21 #include "gdcmDebug.h"
\r
22 #include "gdcmUtil.h"
\r
24 #include <vtkImageData.h>
\r
26 #include <vtkBMPReader.h>
\r
27 #include <vtkBMPWriter.h>
\r
28 #include "vtkGdcmWriter.h"
\r
30 #include <vtkImageExtractComponents.h>
\r
31 #include <vtkPointData.h>
\r
32 #include <vtkDataArray.h>
\r
39 //---------------------------------------------------------------------------
\r
41 int main( int argc, char *argv[] )
\r
45 "usage: Bmp2Dcm {filein=inputFileName|dirin=inputDirectoryName} ",
\r
46 " [studyUID = ] [patName = ] [debug] ",
\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
57 // ----- Initialize Arguments Manager ------
\r
59 GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
\r
61 if (am->ArgMgrDefined("usage") || argc == 1)
\r
63 am->ArgMgrUsage(usage); // Display 'usage'
\r
68 if (am->ArgMgrDefined("debug"))
\r
69 GDCM_NAME_SPACE::Debug::DebugOn();
\r
71 bool verbose = ( 0 != am->ArgMgrDefined("verbose") );
\r
73 const char *fileName = am->ArgMgrGetString("filein");
\r
74 const char *dirName = am->ArgMgrGetString("dirin");
\r
76 if ( (fileName == 0 && dirName == 0)
\r
78 (fileName != 0 && dirName != 0) )
\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
88 std::string patName = am->ArgMgrGetString("patname", dirName);
\r
89 bool userDefinedStudy = ( 0 != am->ArgMgrDefined("studyUID") );
\r
90 const char *studyUID;
\r
91 if (userDefinedStudy)
\r
92 studyUID = am->ArgMgrGetString("studyUID");
\r
94 // not described *on purpose* in the Usage !
\r
95 bool userDefinedSerie = ( 0 != am->ArgMgrDefined("serieUID") );
\r
96 const char *serieUID;
\r
97 if(userDefinedSerie)
\r
98 serieUID = am->ArgMgrGetString("serieUID");
\r
100 /* if unused Param we give up */
\r
101 if ( am->ArgMgrPrintUnusedLabels() )
\r
103 am->ArgMgrUsage(usage);
\r
108 delete am; // ------ we don't need Arguments Manager any longer ------
\r
111 // ----- Begin Processing -----
\r
114 std::string nomFich;
\r
116 if ( fileName != 0 ) // ====== Deal with a single file ======
\r
118 vtkBMPReader* Reader = vtkBMPReader::New();
\r
119 if ( Reader->CanReadFile(fileName ) == 0) {
\r
120 // skip 'non BMP' files
\r
123 std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;
\r
128 std::cout << "deal with [" << fileName << "]" << std::endl;
\r
131 Reader->SetFileName(fileName);
\r
134 vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
\r
135 Red->SetInput(Reader->GetOutput());
\r
136 Red->SetComponents(0);
\r
139 vtkGdcmWriter* Writer = vtkGdcmWriter::New();
\r
140 Writer->SetInput(Red->GetOutput());
\r
142 nomFich = nomFich+fileName+".acr";
\r
150 else // ====== Deal with a (single Patient) Directory ======
\r
153 if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirName) )
\r
155 std::cout << "KO : [" << dirName << "] is not a Directory." << std::endl;
\r
161 std::cout << "OK : [" << dirName << "] is a Directory." << std::endl;
\r
163 std::string strStudyUID;
\r
164 std::string strSerieUID;
\r
166 if (userDefinedStudy)
\r
167 strSerieUID = studyUID;
\r
169 strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
\r
171 if (userDefinedStudy)
\r
172 strSerieUID = serieUID;
\r
174 strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
\r
177 std::cout << "dirName [" << dirName << "]" << std::endl;
\r
179 GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list
\r
180 GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
\r
182 for( GDCM_NAME_SPACE::DirListType::iterator it = fileList.begin();
\r
183 it != fileList.end();
\r
186 if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' )
\r
188 // skip hidden files
\r
192 vtkBMPReader* Reader = vtkBMPReader::New();
\r
194 if ( Reader->CanReadFile(it->c_str() ) == 0) {
\r
195 // skip 'non BMP' files
\r
201 std::cout << "deal with [" << it->c_str() << "]" << std::endl;
\r
203 Reader->SetFileName(it->c_str());
\r
206 dim=Reader->GetOutput()->GetDimensions();
\r
207 vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
\r
208 Red->SetInput(Reader->GetOutput());
\r
209 Red->SetComponents(0);
\r
212 // At least, created files will look like a Serie from a single Study ...
\r
213 GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();
\r
214 f->InsertEntryString(strStudyUID, 0x0020, 0x000d, "UI");
\r
215 f->InsertEntryString(strSerieUID, 0x0020, 0x000e, "UI");
\r
216 f->InsertEntryString(patName, 0x0010, 0x0010, "PN"); // Patient's Name
\r
218 vtkGdcmWriter* Writer = vtkGdcmWriter::New();
\r
219 Writer->SetInput(Red->GetOutput());
\r
221 nomFich = nomFich+it->c_str()+".acr";
\r
222 Writer->SetFileName(nomFich.c_str());
\r
223 Writer->SetGdcmFile(f);
\r