]> Creatis software - gdcm.git/commitdiff
Little utility.
authorjpr <jpr>
Tue, 26 Jun 2007 15:40:38 +0000 (15:40 +0000)
committerjpr <jpr>
Tue, 26 Jun 2007 15:40:38 +0000 (15:40 +0000)
(better we write 'anything to Dcm' !

vtk/Bmp2Dcm.cxx [new file with mode: 0755]

diff --git a/vtk/Bmp2Dcm.cxx b/vtk/Bmp2Dcm.cxx
new file mode 100755 (executable)
index 0000000..ac73254
--- /dev/null
@@ -0,0 +1,214 @@
+/*=========================================================================\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