]> Creatis software - gdcm.git/blobdiff - Example/exReadWriteFile.cxx
Synchronize (fix comments, misstyping, re ident, etc)
[gdcm.git] / Example / exReadWriteFile.cxx
index 28a5f4e0614c6773509ffdd84025711c6ef31bf4..f0ff1209e56753685559bb99ab0c63f3ce588acb 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: exReadWriteFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/02/03 15:44:20 $
-  Version:   $Revision: 1.1 $
+  Date:      $Date: 2010/09/01 14:41:48 $
+  Version:   $Revision: 1.11 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 #include "gdcmFile.h"
 #include "gdcmFileHelper.h"
 #include "gdcmDocument.h"
-#include "gdcmValEntry.h"
-#include "gdcmBinEntry.h"
+#include "gdcmDataEntry.h"
 #include "gdcmSeqEntry.h"
 
-// ----- WARNING ----- WARNING ----- WARNING ----- WARNING ----- WARNING ---
-//
-// This program is NOT intendend to be run as is.
-//
-// It just shows a set of possible uses.
-// User MUST read it, 
-//           comment out the useless parts
-//           invoke it with an ad hoc image(*)
-//           check the resulting image      
-// 
-// (*) For samples, user can refer to gdcmData
-//         and read README.txt file
-//
-// ----- WARNING ----- WARNING ----- WARNING ----- WARNING ----- WARNING ---
-
+#include <stdlib.h> // for exit
  
 int main(int argc, char *argv[])
 {
+std::cout << " --- WARNING --- WARNING --- WARNING --- WARNING ---" <<std::endl;
+std::cout << " "                                                    <<std::endl; 
+std::cout << " This source program is NOT intendend to be run as is"<<std::endl;
+std::cout << " "                                                    <<std::endl;
+std::cout << " It just shows a set of possible uses."               <<std::endl;
+std::cout << "User MUST read it, "                                  <<std::endl;
+std::cout << "          comment out the useless parts "             <<std::endl;
+std::cout << "          invoke it with an ad hoc image(*) "         <<std::endl;
+std::cout << "          check the resulting image   "               <<std::endl;
+std::cout << "  "                                                   <<std::endl;
+std::cout << " (*) For samples, user can refer to gdcmData"         <<std::endl;
+std::cout << "         and read README.txt file "                   <<std::endl;
+std::cout << " "                                                    <<std::endl;
+std::cout << "This source program will be splitted into smaller elementary" 
+          <<  " programs"                                           <<std::endl;
+std::cout << " "                                                    <<std::endl;
+std::cout << " --- WARNING --- WARNING --- WARNING --- WARNING ---" <<std::endl;
+
    if (argc < 3)
    {
       std::cerr << "Usage :" << std::endl << 
@@ -51,76 +54,69 @@ int main(int argc, char *argv[])
    std::string filename = argv[1];
    std::string output   = argv[2];
 
-   // First, let's create a gdcm::File
-   // that will contain all the Dicom Field but the Pixels Element
+   // First, let's create a GDCM_NAME_SPACE::File
+   // that will contain all the Dicom fields but the Pixels Element
 
-   gdcm::File *e1= new gdcm::File( filename );
+   GDCM_NAME_SPACE::File *f1= GDCM_NAME_SPACE::File::New( );
+   f1->SetFileName( filename );
+   f1->Load();
 
 
    // Ask content to be printed
    std::cout << std::endl
              << "--- Standard Print -------------------------------------------"
              << std::endl;
-   e1->SetPrintLevel(2);   // to have a nice output
-   //e1->SetPrintLevel(1); 
-   e1->Print();            // user may comment out if too much verbose
+   f1->SetPrintLevel(2);   // to have a nice output
+   //f1->SetPrintLevel(1); 
+   f1->Print();            // user may comment out if too much verbose
 
 
-  // Field by field Printing
+  // User asks for field by field Printing
   
    std::cout << std::endl
              << "--- Display only human readable values -----------------------"
              << std::endl;
 
-   gdcm::ValEntry *valEntry;
-   uint16_t group;
-   uint16_t elem;
-   int offset;
+   GDCM_NAME_SPACE::DataEntry *dataEntry;
    std::string value;
-   std::string vr;   // value representation
+   GDCM_NAME_SPACE::VRKey vr;   // value representation
    std::string vm;   // value multiplicity
    std::string name; // held in the Dicom Dictionary
 
 
-   gdcm::DocEntry *d = e1->GetFirstEntry();
+   GDCM_NAME_SPACE::DocEntry *d = f1->GetFirstEntry();
    while( d )
    {
       // We skip SeqEntries, since user cannot do much with them
-      if ( !(dynamic_cast<gdcm::SeqEntry*>(d))
+      if ( !(dynamic_cast<GDCM_NAME_SPACE::SeqEntry*>(d))
       // We skip Shadow Groups, since nobody knows what they mean
-           && !( d->GetGroup()%2 )
-     // we skip BinEntries, since their content is not human-readable
-           && !dynamic_cast<gdcm::BinEntry*>(d) )
+           && !( d->GetGroup()%2 ) )
      {      
          // If user just 'wants to see'
          //d->Print();
          //std::cout << std::endl;
 
          // If user wants to get info about the entry
-         // (he is sure, here that DocEntry is a ValEntry)
-         valEntry = dynamic_cast<gdcm::ValEntry*>(d);
+         // (he is sure, here that DocEntry is a DataEntry)
+         dataEntry = dynamic_cast<GDCM_NAME_SPACE::DataEntry *>(d);
          // Let's be carefull -maybe he commented out some previous line-
-         if (!valEntry)
+         if (!dataEntry)
             continue;
 
-         value  = valEntry->GetValue();
-         group  = valEntry->GetGroup();
-         elem   = valEntry->GetElement();
-         vr     = valEntry->GetVR();
+         value  = dataEntry->GetString();
+         vr     = dataEntry->GetVR();
          // user wants really to know everything about entry!
-         vm     = valEntry->GetVM();
-         name   = valEntry->GetName();
-         offset = valEntry->GetOffset();
+         vm     = dataEntry->GetVM();
+         name   = dataEntry->GetName();
 
          std::cout //<< std::hex << group << "," << elem 
-          << valEntry->GetKey()
-               << "     VR :[" << vr    << "] VM : [" << vm 
+             << dataEntry->GetKey()
+             << "     VR :[" << vr    << "] VM : [" << vm 
              << "] name : [" << name  << "]"
              << " value : [" << value << "]" 
-              << std::endl;
+             << std::endl;
       }
-      d = e1->GetNextEntry();
+      d = f1->GetNextEntry();
    }
 
    std::cout << std::endl
@@ -130,17 +126,17 @@ int main(int argc, char *argv[])
    // ------ some pre-defined acessors may supply usefull informations ----
 
    // about Image
-   int linesNumber   = e1->GetYSize();
-   int rawsNumber    = e1->GetXSize();
-   int framesNumber  = e1->GetYSize();// defaulted to 1 if not found
+   int linesNumber   = f1->GetYSize();
+   int rawsNumber    = f1->GetXSize();
+   int framesNumber  = f1->GetYSize();// defaulted to 1 if not found
 
    std::cout << "lines : "   << linesNumber  << " columns : " << rawsNumber
              << " frames : " << framesNumber << std::endl;
  
    // about Pixels
-   int pixelSize         = e1->GetPixelSize(); 
-   std::string pixelType = e1->GetPixelType();
-   bool isSigned         = e1->IsSignedPixelData();
+   int pixelSize         = f1->GetPixelSize(); 
+   std::string pixelType = f1->GetPixelType();
+   bool isSigned         = f1->IsSignedPixelData();
   
    std::cout << "pixelSize : "   << pixelSize  << " pixelType : " << pixelType
              << " signed : "     << isSigned   << std::endl;
@@ -148,24 +144,24 @@ int main(int argc, char *argv[])
    // about pixels, too.
    // Better you forget these ones
   
-   std::cout << "GetBitsStored()"      << e1->GetBitsStored()      << std::endl;
-   std::cout << "GetBitsAllocated()"   << e1->GetBitsAllocated()   << std::endl;
-   std::cout << "GetHighBitPosition()" << e1->GetHighBitPosition() << std::endl;
+   std::cout << "GetBitsStored()"      << f1->GetBitsStored()      << std::endl;
+   std::cout << "GetBitsAllocated()"   << f1->GetBitsAllocated()   << std::endl;
+   std::cout << "GetHighBitPosition()" << f1->GetHighBitPosition() << std::endl;
 
    std::cout << "GetSamplesPerPixel()"     
-          << e1->GetSamplesPerPixel()     << std::endl;
+          << f1->GetSamplesPerPixel()     << std::endl;
    std::cout << "GetPlanarConfiguration()" 
-          << e1->GetPlanarConfiguration() << std::endl; 
+          << f1->GetPlanarConfiguration() << std::endl; 
  
    // about 'image geography'
  
-   float xs = e1->GetXSpacing();
-   float ys = e1->GetYSpacing();
-   float zs = e1->GetZSpacing();  // defaulted to 1.0 if not found
+   float xs = f1->GetXSpacing();
+   float ys = f1->GetYSpacing();
+   float zs = f1->GetZSpacing();  // defaulted to 1.0 if not found
 
-   float xo = e1->GetXOrigin();
-   float yo = e1->GetYOrigin();
-   float zo = e1->GetZOrigin();
+   float xo = f1->GetXOrigin();
+   float yo = f1->GetYOrigin();
+   float zo = f1->GetZOrigin();
 
    std::cout << "GetXSpacing()"     << xs      << std::endl;
    std::cout << "GetYSpacing()"     << ys      << std::endl;
@@ -178,16 +174,16 @@ int main(int argc, char *argv[])
    // about its way to store colors (if user is aware)
 
    // checks Photometric Interpretation
-   std::cout << "IsMonochrome()"   << e1->IsMonochrome()     << std::endl;
-   std::cout << "IsYBRFull()"      << e1->IsYBRFull()        << std::endl;
-   std::cout << "IsPaletteColor()" << e1->IsPaletteColor()   << std::endl;
+   std::cout << "IsMonochrome()"   << f1->IsMonochrome()     << std::endl;
+   std::cout << "IsYBRFull()"      << f1->IsYBRFull()        << std::endl;
+   std::cout << "IsPaletteColor()" << f1->IsPaletteColor()   << std::endl;
    // checks if LUT are found
-   std::cout << "HasLUT()"         << e1->HasLUT()           << std::endl;
+   std::cout << "HasLUT()"         << f1->HasLUT()           << std::endl;
 
    std::cout << "GetNumberOfScalarComponents()"    
-          << e1->GetNumberOfScalarComponents()<< std::endl;
+          << f1->GetNumberOfScalarComponents()<< std::endl;
    std::cout << "GetNumberOfScalarComponentsRaw()" 
-          << e1->GetNumberOfScalarComponentsRaw()<< std::endl;
+          << f1->GetNumberOfScalarComponentsRaw()<< std::endl;
   
 
    std::cout << std::endl
@@ -195,29 +191,32 @@ int main(int argc, char *argv[])
              << std::endl;
    // ------ User is aware, and wants to get fields with no accesor --------
 
-   std::cout << "Manufacturer :["     << e1->GetEntryValue(0x0008,0x0070)
+   std::cout << "Manufacturer :["     << f1->GetEntryString(0x0008,0x0070)
              << "]" << std::endl; 
-   std::cout << "Institution :["      << e1->GetEntryValue(0x0008,0x0080)
+   std::cout << "Institution :["      << f1->GetEntryString(0x0008,0x0080)
              << "]" << std::endl;
-   std::cout << "Patient's name :["   << e1->GetEntryValue(0x0010,0x0010)
+   std::cout << "Patient's name :["   << f1->GetEntryString(0x0010,0x0010)
              << "]" << std::endl;
-   std::cout << "Physician's name :[" << e1->GetEntryValue(0x0008,0x0090)
+   std::cout << "Physician's name :[" << f1->GetEntryString(0x0008,0x0090)
              << "]" << std::endl; 
-   std::cout << "Study Date :["       << e1->GetEntryValue(0x0008,0x0020)
+   std::cout << "Study Date :["       << f1->GetEntryString(0x0008,0x0020)
              << "]" << std::endl; 
-   std::cout << "Study inst UID :["   << e1->GetEntryValue(0x0020,0x000d)
+   std::cout << "Study inst UID :["   << f1->GetEntryString(0x0020,0x000d)
              << "]" << std::endl;
-   std::cout << "Serie inst UID :["   << e1->GetEntryValue(0x0020,0x000e)
+   std::cout << "Serie inst UID :["   << f1->GetEntryString(0x0020,0x000e)
              << "]" << std::endl;
-   std::cout << "Frame ref UID :["   << e1->GetEntryValue(0x0020,0x0052)
+   std::cout << "Frame ref UID :["   << f1->GetEntryString(0x0020,0x0052)
              << "]" << std::endl;
+   // User wants to get info about the 'real world' vs image
+
 
    // ------ User wants to load the pixels---------------------------------
    
    // Hope now he knows enought about the image ;-)
 
-   // First, create a gdcm::FileHelper
-   gdcm::FileHelper *fh1 = new gdcm::FileHelper(e1);
+   // First, create a GDCM_NAME_SPACE::FileHelper
+   GDCM_NAME_SPACE::FileHelper *fh1 = GDCM_NAME_SPACE::FileHelper::New(f1);
 
    // Load the pixels, transforms LUT (if any) into RGB Pixels 
    uint8_t *imageData = fh1->GetImageData();
@@ -231,7 +230,7 @@ int main(int argc, char *argv[])
    // Get the image data size
    size_t dataRawSize    = fh1->GetImageDataRawSize();
 
-   // TODO : Newbee user would appreciate any comment !
+   /// \TODO : Newbee user would appreciate any comment !
  
    std::cout << "GetImageDataSize()"    
           << fh1->GetImageDataSize()    << std::endl;
@@ -252,35 +251,31 @@ int main(int argc, char *argv[])
  
    // ------ User wants write a new image without shadow groups -------------
 
-   gdcm::FileHelper *copy = new gdcm::FileHelper( output );
+   GDCM_NAME_SPACE::FileHelper *copy = GDCM_NAME_SPACE::FileHelper::New( );
+   copy->SetFileName( output );
+   copy->Load();
  
-   d = e1->GetFirstEntry();
+   d = f1->GetFirstEntry();
    while(d)
    {
       // We skip SeqEntries, since user cannot do much with them
-      if ( !(dynamic_cast<gdcm::SeqEntry*>(d))
+      if ( !(dynamic_cast<GDCM_NAME_SPACE::SeqEntry*>(d))
       // We skip Shadow Groups, since nobody knows what they mean
            && !( d->GetGroup()%2 ) )
       { 
 
-         if ( gdcm::BinEntry *b = dynamic_cast<gdcm::BinEntry*>(d) )
+         if ( GDCM_NAME_SPACE::DataEntry *de = dynamic_cast<GDCM_NAME_SPACE::DataEntry *>(d) )
          {              
-            copy->GetFile()->InsertBinEntry( b->GetBinArea(),b->GetLength(),
-                                             b->GetGroup(),b->GetElement(),
-                                             b->GetVR() );
-         }
-         else if ( gdcm::ValEntry *v = dynamic_cast<gdcm::ValEntry*>(d) )
-         {   
-             copy->GetFile()->InsertValEntry( v->GetValue(),
-                                              v->GetGroup(),v->GetElement(),
-                                              v->GetVR() ); 
+            copy->GetFile()->InsertEntryBinArea( de->GetBinArea(),de->GetLength(),
+                                                 de->GetGroup(),de->GetElement(),
+                                                 de->GetVR() );
          }
          else
          {
-          // We skip gdcm::SeqEntries
+          // We skip GDCM_NAME_SPACE::SeqEntries
          }
       }
-      d = e1->GetNextEntry();
+      d = f1->GetNextEntry();
    }
 
    std::cout << std::endl
@@ -309,14 +304,14 @@ int main(int argc, char *argv[])
    // User wants to keep the Palette Color -if any- 
    // and write the image as it was
    copy->SetImageData(imageDataRaw, dataRawSize);
-   copy->SetWriteModeToRGB();
+   copy->SetWriteModeToRaw();
    copy->WriteDcmExplVR( output );
 
 
    std::cout << std::endl
              << "------------------------------------------------------------"
              << std::endl;
-   // User is in a fancy mood and wants to forge a bonm image
+   // User is in a fancy mood and wants to forge a bomb image
    // just to see how other Dicom viewers act
 
 
@@ -326,9 +321,9 @@ int main(int argc, char *argv[])
    std::cout << std::endl
              << "------------------------------------------------------------"
              << std::endl;
-   delete e1;
-   delete fh1;
-   delete copy;
+   f1->Delete();
+   fh1->Delete();
+   copy->Delete();
 
    exit (0);
 }