/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "gdcmReader.h" #include "gdcmImageReader.h" #include "gdcmFileMetaInformation.h" #include "gdcmDataSet.h" #include "gdcmPrinter.h" #include "gdcmDictPrinter.h" #include "gdcmValidate.h" #include "gdcmWriter.h" #include "gdcmDumper.h" #include "gdcmSystem.h" #include "gdcmDirectory.h" #include "gdcmOverlay.h" #include #include #include /* for printf */ #include /* for exit */ #include #include template int DoOperation(const std::string & filename) { gdcm::ImageReader reader; reader.SetFileName( filename.c_str() ); if( !reader.Read() ) { std::cerr << "Failed to read: " << filename << std::endl; return 1; } // Image part: const gdcm::Image& img = reader.GetImage(); img.Print( std::cout ); // Overlay part: unsigned int n = reader.GetImage().GetNumberOfOverlays(); std::cout << "Num of Overlays: " << n << std::endl; for(unsigned int i = 0; i < n; ++i ) { const gdcm::Overlay& o = reader.GetImage().GetOverlay(i); o.Print( std::cout ); } return 0; } int main (int argc, char *argv[]) { int c; //int digit_optind = 0; std::string filename; bool printdict = false; bool verbose = false; while (1) { //int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"input", 1, 0, 0}, {"output", 1, 0, 0}, {"dict", 1, 0, 0}, {"verbose", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "i:o:dv", long_options, &option_index); if (c == -1) { break; } switch (c) { case 0: { const char *s = long_options[option_index].name; printf ("option %s", s); if (optarg) { if( option_index == 0 ) /* input */ { assert( strcmp(s, "input") == 0 ); assert( filename.empty() ); filename = optarg; } printf (" with arg %s", optarg); } printf ("\n"); } break; case 'i': //printf ("option i with value '%s'\n", optarg); assert( filename.empty() ); filename = optarg; break; case 'o': printf ("option o with value '%s'\n", optarg); break; case 'd': //printf ("option d with value '%s'\n", optarg); printdict = true; break; case 'v': //printf ("option d with value '%s'\n", optarg); verbose = true; break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) { printf ("%s ", argv[optind++]); } printf ("\n"); } if( filename.empty() ) { std::cerr << "Need input file (-i)\n"; return 1; } // else int res = 0; if( gdcm::System::FileIsDirectory( filename.c_str() ) ) { gdcm::Directory d; d.Load(filename); gdcm::Directory::FilenamesType const &filenames = d.GetFilenames(); for( gdcm::Directory::FilenamesType::const_iterator it = filenames.begin(); it != filenames.end(); ++it ) { if( printdict ) { res += DoOperation(*it); } else { res += DoOperation(*it); } if( verbose ) std::cerr << *it << std::endl; } if( verbose ) std::cerr << "Total: " << filenames.size() << " files were processed" << std::endl; } else { assert( gdcm::System::FileExists(filename.c_str()) ); if( printdict ) { res += DoOperation(filename); } else { res += DoOperation(filename); } // ... if ( verbose ) std::cerr << "Filename: " << filename << std::endl; } return res; }