--- /dev/null
+/*=========================================================================\r
+ \r
+ Program: gdcm\r
+ Module: $RCSfile: Bmp2Dcm.cxx,v $\r
+ Language: C++\r
+ Date: $Date: 2007/06/26 15:40:38 $\r
+ Version: $Revision: 1.1 $\r
+ \r
+ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de\r
+ l'Image). All rights reserved. See Doc/License.txt or\r
+ http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.\r
+ \r
+ This software is distributed WITHOUT ANY WARRANTY; without even\r
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
+ PURPOSE. See the above copyright notices for more information.\r
+ \r
+=========================================================================*/\r
+\r
+#include "gdcmArgMgr.h"\r
+#include "gdcmDirList.h"\r
+#include "gdcmDebug.h"\r
+#include "gdcmUtil.h"\r
+\r
+#include <vtkImageData.h>\r
+\r
+#include <vtkBMPReader.h>\r
+#include <vtkBMPWriter.h>\r
+#include "vtkGdcmWriter.h"\r
+\r
+#include <vtkImageExtractComponents.h>\r
+#include <vtkPointData.h>\r
+#include <vtkDataArray.h>\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <math.h>\r
+\r
+//---------------------------------------------------------------------------\r
+\r
+int main( int argc, char *argv[] )\r
+{\r
+ START_USAGE(usage)\r
+ "\n Bmp2Dcm :\n ", \r
+ "usage: Bmp2Dcm {filein=inputFileName|dirin=inputDirectoryName} ",\r
+ " [studyUID = ] [patName = ] [debug] ", \r
+ " ",\r
+ " inputFileName : Name of the (single) file user wants to transform ",\r
+ " inputDirectoryName : user wants to transform *all* the files ",\r
+ " studyUID : *aware* user wants to add the serie ",\r
+ " to an already existing study ", \r
+ " verbose : user wants to run the program in 'verbose mode' ", \r
+ " debug : *developper* wants to run the program in 'debug mode' ",\r
+ \r
+ FINISH_USAGE\r
+\r
+ // ----- Initialize Arguments Manager ------\r
+ \r
+ GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);\r
+ \r
+ if (am->ArgMgrDefined("usage") || argc == 1) \r
+ {\r
+ am->ArgMgrUsage(usage); // Display 'usage'\r
+ delete am;\r
+ return 0;\r
+ }\r
+\r
+ if (am->ArgMgrDefined("debug"))\r
+ GDCM_NAME_SPACE::Debug::DebugOn();\r
+ \r
+ int verbose = am->ArgMgrDefined("verbose");\r
+ \r
+ const char *fileName = am->ArgMgrGetString("filein");\r
+ const char *dirName = am->ArgMgrGetString("dirin");\r
+\r
+ if ( (fileName == 0 && dirName == 0)\r
+ ||\r
+ (fileName != 0 && dirName != 0) )\r
+ {\r
+ std::cout <<std::endl\r
+ << "Either 'filein=' or 'dirin=' must be present;" \r
+ << std::endl << "Not both" << std::endl;\r
+ am->ArgMgrUsage(usage); // Display 'usage' \r
+ delete am;\r
+ return 0;\r
+ }\r
+ \r
+ std::string patName = am->ArgMgrGetString("patname", dirName);\r
+ \r
+ bool userDefinedStudy = am->ArgMgrDefined("studyUID");\r
+ const char *studyUID = am->ArgMgrGetString("studyUID"); \r
+\r
+// not described *on purpose* in the Usage ! \r
+ bool userDefinedSerie = am->ArgMgrDefined("serieUID"); \r
+ const char *serieUID = am->ArgMgrGetString("serieUID");\r
+ \r
+ /* if unused Param we give up */\r
+ if ( am->ArgMgrPrintUnusedLabels() )\r
+ {\r
+ am->ArgMgrUsage(usage);\r
+ delete am;\r
+ return 0;\r
+ } \r
+ \r
+ delete am; // ------ we don't need Arguments Manager any longer ------\r
+\r
+ int *dim;\r
+ std::string nomFich;\r
+ \r
+ if ( fileName != 0 ) // ====== Deal with a single file ======\r
+ { \r
+ vtkBMPReader* Reader = vtkBMPReader::New();\r
+ if ( Reader->CanReadFile(fileName ) == 0) {\r
+ // skip 'non BMP' files \r
+ Reader->Delete();\r
+ if (verbose)\r
+ std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;\r
+ return 0;\r
+ }\r
+ \r
+ if (verbose)\r
+ std::cout << "deal with [" << fileName << "]" << std::endl;\r
+ //Read BMP file\r
+\r
+ Reader->SetFileName(fileName);\r
+ Reader->Update();\r
+\r
+ vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
+ Red->SetInput(Reader->GetOutput());\r
+ Red->SetComponents(0);\r
+ Red->Update();\r
+\r
+ vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
+ Writer->SetInput(Red->GetOutput());\r
+ nomFich = "";\r
+ nomFich = nomFich+fileName+".acr"; \r
+ Writer->Write();\r
+ \r
+ Reader->Delete();\r
+ Red->Delete();\r
+ Writer->Delete();\r
+ \r
+ }\r
+ else // ====== Deal with a (single Patient) Directory ======\r
+ { \r
+ std::string strStudyUID;\r
+ std::string strSerieUID;\r
+\r
+ if (userDefinedStudy)\r
+ strSerieUID = studyUID;\r
+ else\r
+ strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();\r
+ \r
+ if (userDefinedStudy)\r
+ strSerieUID = serieUID;\r
+ else\r
+ strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID(); \r
+\r
+ if(verbose)\r
+ std::cout << "dirName [" << dirName << "]" << std::endl;\r
+ \r
+ GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list\r
+ GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();\r
+\r
+ for( GDCM_NAME_SPACE::DirListType::iterator it = fileList.begin();\r
+ it != fileList.end();\r
+ ++it )\r
+ {\r
+ if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' ) \r
+ {\r
+ // skip hidden files\r
+ continue;\r
+ }\r
+ \r
+ vtkBMPReader* Reader = vtkBMPReader::New();\r
+ \r
+ if ( Reader->CanReadFile(it->c_str() ) == 0) {\r
+ // skip 'non BMP' files \r
+ Reader->Delete();\r
+ continue;\r
+ }\r
+ \r
+ if (verbose)\r
+ std::cout << "deal with [" << it->c_str() << "]" << std::endl; \r
+ \r
+ Reader->SetFileName(it->c_str()); \r
+ Reader->Update();\r
+ \r
+ dim=Reader->GetOutput()->GetDimensions();\r
+ vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
+ Red->SetInput(Reader->GetOutput());\r
+ Red->SetComponents(0);\r
+ Red->Update();\r
+\r
+ // At least, created files will look like a Serie from a single Study ... \r
+ GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();\r
+ f->InsertEntryString(strStudyUID, 0x0020, 0x000d, "UI"); \r
+ f->InsertEntryString(strSerieUID, 0x0020, 0x000e, "UI");\r
+ f->InsertEntryString(patName, 0x0010, 0x0010, "PN"); // Patient's Name \r
+\r
+ vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
+ Writer->SetInput(Red->GetOutput());\r
+ nomFich = "";\r
+ nomFich = nomFich+it->c_str()+".acr";\r
+ Writer->SetFileName(nomFich.c_str());\r
+ Writer->SetGdcmFile(f);\r
+ Writer->Write();\r
+ \r
+ f->Delete(); \r
+ \r
+ }\r
+ } \r
+ return 0; \r
+}\r