1 /*=========================================================================
\r
4 Module: $RCSfile: Bmp2Dcm.cxx,v $
\r
6 Date: $Date: 2007/06/27 08:43:25 $
\r
7 Version: $Revision: 1.2 $
\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 int verbose = 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
90 bool userDefinedStudy = am->ArgMgrDefined("studyUID");
\r
91 const char *studyUID;
\r
92 if (userDefinedStudy)
\r
93 studyUID = am->ArgMgrGetString("studyUID");
\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
101 /* if unused Param we give up */
\r
102 if ( am->ArgMgrPrintUnusedLabels() )
\r
104 am->ArgMgrUsage(usage);
\r
109 delete am; // ------ we don't need Arguments Manager any longer ------
\r
112 // ----- Begin Processing -----
\r
115 std::string nomFich;
\r
117 if ( fileName != 0 ) // ====== Deal with a single file ======
\r
119 vtkBMPReader* Reader = vtkBMPReader::New();
\r
120 if ( Reader->CanReadFile(fileName ) == 0) {
\r
121 // skip 'non BMP' files
\r
124 std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;
\r
129 std::cout << "deal with [" << fileName << "]" << std::endl;
\r
132 Reader->SetFileName(fileName);
\r
135 vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
\r
136 Red->SetInput(Reader->GetOutput());
\r
137 Red->SetComponents(0);
\r
140 vtkGdcmWriter* Writer = vtkGdcmWriter::New();
\r
141 Writer->SetInput(Red->GetOutput());
\r
143 nomFich = nomFich+fileName+".acr";
\r
151 else // ====== Deal with a (single Patient) Directory ======
\r
154 if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirName) )
\r
156 std::cout << "KO : [" << dirName << "] is not a Directory." << std::endl;
\r
162 std::cout << "OK : [" << dirName << "] is a Directory." << std::endl;
\r
164 std::string strStudyUID;
\r
165 std::string strSerieUID;
\r
167 if (userDefinedStudy)
\r
168 strSerieUID = studyUID;
\r
170 strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
\r
172 if (userDefinedStudy)
\r
173 strSerieUID = serieUID;
\r
175 strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
\r
178 std::cout << "dirName [" << dirName << "]" << std::endl;
\r
180 GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list
\r
181 GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
\r
183 for( GDCM_NAME_SPACE::DirListType::iterator it = fileList.begin();
\r
184 it != fileList.end();
\r
187 if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' )
\r
189 // skip hidden files
\r
193 vtkBMPReader* Reader = vtkBMPReader::New();
\r
195 if ( Reader->CanReadFile(it->c_str() ) == 0) {
\r
196 // skip 'non BMP' files
\r
202 std::cout << "deal with [" << it->c_str() << "]" << std::endl;
\r
204 Reader->SetFileName(it->c_str());
\r
207 dim=Reader->GetOutput()->GetDimensions();
\r
208 vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
\r
209 Red->SetInput(Reader->GetOutput());
\r
210 Red->SetComponents(0);
\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
219 vtkGdcmWriter* Writer = vtkGdcmWriter::New();
\r
220 Writer->SetInput(Red->GetOutput());
\r
222 nomFich = nomFich+it->c_str()+".acr";
\r
223 Writer->SetFileName(nomFich.c_str());
\r
224 Writer->SetGdcmFile(f);
\r