]> Creatis software - gdcm.git/commitdiff
* src/gdcmBinEntry.cxx, gdcmSeqEntry.cxx, gdcmSQItem.cxx, gdcmValEntry.cxx :
authorregrain <regrain>
Wed, 24 Nov 2004 16:39:17 +0000 (16:39 +0000)
committerregrain <regrain>
Wed, 24 Nov 2004 16:39:17 +0000 (16:39 +0000)
     Add a print information of the type of the entry
   * src/gdcmDocument.cxx : add the write of the preambule of a Dicom file.
     It was in the gdcmFile, and all write have been regrouped
   * src/gdcmFile.[h|cxx] : add methods to get the Raw data elements and size.
     Write correctly all dicom files (in decompressed mode only at this time)
   * Test/ : test on files are now made using Raw datas and not color datas if
     any.
   * Example/PrintFile.cxx : add more printings
   -- BeNours

12 files changed:
ChangeLog
Example/PrintFile.cxx
Testing/TestAllReadCompareDicom.cxx
Testing/TestCopyDicom.cxx
Testing/TestReadWriteReadCompare.cxx
src/gdcmBinEntry.cxx
src/gdcmDocument.cxx
src/gdcmFile.cxx
src/gdcmFile.h
src/gdcmSQItem.cxx
src/gdcmSeqEntry.cxx
src/gdcmValEntry.cxx

index 6e84dc2832e1835694202bfafb846f117085c11a..c96d898f5358f772ce1ed02d0cb5c93fae2744d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2004-11-24 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
+   * src/gdcmBinEntry.cxx, gdcmSeqEntry.cxx, gdcmSQItem.cxx, gdcmValEntry.cxx :
+     Add a print information of the type of the entry
+   * src/gdcmDocument.cxx : add the write of the preambule of a Dicom file.
+     It was in the gdcmFile, and all write have been regrouped
+   * src/gdcmFile.[h|cxx] : add methods to get the Raw data elements and size.
+     Write correctly all dicom files (in decompressed mode only at this time)
+   * Test/ : test on files are now made using Raw datas and not color datas if
+     any.
+   * Example/PrintFile.cxx : add more printings
+
 2004-11-24 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
    * Amelioration of code, remove some code copy. For the loading of
      BinEntry (in gdcmDocument), add the test to verify if the file is already
index 9e41e49cc98b4d0ed9dda85239ab6817acf7bbe1..4b02c55b78d009275ce3ec574fed5d6c7396b587 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: PrintFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 10:23:46 $
-  Version:   $Revision: 1.12 $
+  Date:      $Date: 2004/11/24 16:39:17 $
+  Version:   $Revision: 1.13 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -46,7 +46,9 @@ int main(int argc, char* argv[])
    std::cout << "\n\n" << std::endl; 
 
    int dataSize = f1->GetImageDataSize();
-   std::cout <<std::endl <<" dataSize " << dataSize << std::endl;
+   std::cout <<std::endl;
+   std::cout <<" dataSize " << dataSize << std::endl;
+   std::cout <<" dataSizeRaw " << f1->GetImageDataSizeRaw() << std::endl;
    int nX,nY,nZ,sPP,planarConfig;
    std::string pixelType;
    nX=e1->GetXSize();
index 5472f477c82b1aeff35cc4d644c958036b84d7b0..11a2d7defdd06a7c7022e3ad8e0e8842e4c60832 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: TestAllReadCompareDicom.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 10:23:46 $
-  Version:   $Revision: 1.17 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.18 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -27,59 +27,58 @@ int InternalTest(std::string const & filename,
 {
       std::cout << "   Testing: " << filename << std::endl;
 
+      ////// Step 1:
+      std::cout << "      1...";
       gdcm::File* tested = new gdcm::File( filename );
       if( !tested->GetHeader()->IsReadable() )
       {
-        std::cout << "      Image not gdcm compatible:"
+        std::cout << " Failed" << std::endl
+                   << "      Image not gdcm compatible:"
                   << filename << std::endl;
         delete tested;
         return 1;
       }
 
       ////// Step 2:
-
       ////// Check for existence of reference baseline dicom file:
+      std::cout << "2...";
 
       FILE* testFILE = fopen( referenceFileName.c_str(), "r" );
       if (! testFILE )
       {
-      ////// Step 3a:
-         uint8_t* testedImageData = tested->GetImageData(); // Kludge
+         uint8_t* testedImageData = tested->GetImageDataRaw(); // Kludge
          (void)testedImageData;
 
          tested->WriteDcmExplVR( referenceFileName );
-         std::cerr << "      Creating reference baseline file :" << std::endl
-                   << "      " << referenceFileName 
-                   << std::endl;
-         delete tested;
-         //delete (char*)testedImageData;
-         return 0;
       }
       else
       {
          fclose( testFILE );
       }
 
+      ////// Step 3a:
       ////// When reference file is not gdcm readable test is failed:
-  
+      std::cout << "3a...";
+
       gdcm::File* reference = new gdcm::File( referenceFileName );
       if( !reference->GetHeader()->IsReadable() )
       {
-         std::cout << "      Failed: reference image " << std::endl
-                   << "              " << referenceFileName <<std::endl
-                   << "              is not gdcm compatible." << std::endl;
+         std::cout << " Failed" << std::endl
+                   << "              reference image " 
+                   << referenceFileName 
+                   << " is not gdcm compatible." << std::endl;
          delete tested;
          delete reference;
          return 1;
       }
 
       ////// Step 3b:
-
-      int testedDataSize    = tested->GetImageDataSize();
-      uint8_t* testedImageData = tested->GetImageData();
+      std::cout << "3b...";
+      int testedDataSize    = tested->GetImageDataSizeRaw();
+      uint8_t* testedImageData = tested->GetImageDataRaw();
     
-      int    referenceDataSize = reference->GetImageDataSize();
-      uint8_t* referenceImageData = reference->GetImageData();
+      int    referenceDataSize = reference->GetImageDataSizeRaw();
+      uint8_t* referenceImageData = reference->GetImageDataRaw();
 
       if (testedDataSize != referenceDataSize)
       {
@@ -108,7 +107,7 @@ int InternalTest(std::string const & filename,
       delete tested;
       delete reference;
 
-      std::cout << "      Passed..." << std::endl;
+      std::cout << "OK." << std::endl;
       
       return 0;
 }
index 66c2ad2214992fe18c5677a247a3a72e9449601d..5a3aa14e53be95283d3eb6a6279c5ba565194dc2 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: TestCopyDicom.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 10:23:46 $
-  Version:   $Revision: 1.19 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.20 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -76,8 +76,8 @@ int CopyDicom(std::string const & filename,
       gdcm::File *original = new gdcm::File( filename );
       gdcm::File *copy = new gdcm::File( output );
 
-      size_t dataSize = original->GetImageDataSize();
-      uint8_t* imageData = original->GetImageData();
+      size_t dataSize = original->GetImageDataSizeRaw();
+      uint8_t* imageData = original->GetImageDataRaw();
       (void)dataSize;  // To use the variable and not have warnings at compil.
       (void)imageData; // To use the variable and not have warnings at compil.
 
@@ -152,8 +152,8 @@ int CopyDicom(std::string const & filename,
 
       //////////////// Step 5:
       std::cout << "5...";
-      int    dataSizeWritten = copy->GetImageDataSize();
-      uint8_t* imageDataWritten = copy->GetImageData();
+      int    dataSizeWritten = copy->GetImageDataSizeRaw();
+      uint8_t* imageDataWritten = copy->GetImageDataRaw();
 
       if (dataSize != dataSizeWritten)
       {
index 5597861e49ebbafc061dd8a8e1536ddf82f64444..24a2a763d0d946da0e797528f5984cd000ba3809 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: TestReadWriteReadCompare.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 10:23:46 $
-  Version:   $Revision: 1.14 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.15 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -40,8 +40,8 @@ int CompareInternal(std::string const & filename, std::string const & output)
    //////////////// Step 2:
 
    gdcm::File*  file = new gdcm::File( header );
-   int dataSize    = file->GetImageDataSize();
-   uint8_t* imageData = file->GetImageData(); //EXTREMELY IMPORTANT
+   int dataSize    = file->GetImageDataSizeRaw();
+   uint8_t* imageData = file->GetImageDataRaw(); //EXTREMELY IMPORTANT
           // Sure, it is : It's up to the user to decide if he wants to
           // GetImageData or if he wants to GetImageDataRaw
           // (even if we do it by setting a flag, he will have to decide) 
@@ -83,8 +83,8 @@ int CompareInternal(std::string const & filename, std::string const & output)
    }
    std::cout << "3...";
    // For the next step:
-   int    dataSizeWritten = reread->GetImageDataSize();
-   uint8_t* imageDataWritten = reread->GetImageData();
+   int    dataSizeWritten = reread->GetImageDataSizeRaw();
+   uint8_t* imageDataWritten = reread->GetImageDataRaw();
 
    //////////////// Step 4:
 
index d0301c5e0ef8a71ff42e26125fd298788c7f3d5c..10fc9898cad6e9e771fdb386fc02348c407dccad 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmBinEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/16 16:20:23 $
-  Version:   $Revision: 1.37 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.38 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -74,6 +74,7 @@ BinEntry::~BinEntry()
  
 void BinEntry::Print(std::ostream &os)
 {
+   os << "B ";
    DocEntry::Print(os);
    std::ostringstream s;
    void* binArea = GetBinArea();
index c5d391396cc11c60b7b040b24e07c9d19869ce90..c5079fe4f8d57c57a7f40d4642354654af0f0a18 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmDocument.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 11:17:47 $
-  Version:   $Revision: 1.136 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.137 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -488,6 +488,15 @@ void Document::Write(std::ofstream* fp, FileType filetype)
    /// (necessary if user wants to write a DICOM V3 file
    /// starting from an  ACR-NEMA (V2)  Header
 
+   if ( filetype == ImplicitVR || filetype == ExplicitVR )
+   {
+      // writing Dicom File Preamble
+      char filePreamble[128];
+      memset(filePreamble, 0, 128);
+      fp->write(filePreamble, 128);
+      fp->write("DICM", 4);
+   }
+
    if (filetype == ImplicitVR) 
    {
       std::string ts = 
@@ -1103,6 +1112,9 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem)
  */
 void Document::LoadEntryBinArea(BinEntry* element) 
 {
+   if(element->GetBinArea())
+      return;
+
    bool openFile = !Fp;
    if(openFile)
       OpenFile();
index 666a8e96f5fdd0245ddfb14ec1d15cb82937732e..46e1f4c07a03933065249c079d659805c01e5666 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 11:17:47 $
-  Version:   $Revision: 1.161 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.162 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -75,7 +75,7 @@ File::File(std::string const & filename )
  */
 void File::Initialise()
 {
-   WriteMode = WMODE_RGB;
+   WriteMode = WMODE_DECOMPRESSED;
    WriteType = WTYPE_IMPL_VR;
 
    PixelConverter = new PixelConvert;
@@ -191,6 +191,37 @@ int File::ComputeDecompressedPixelDataSizeFromHeader()
    return DecompressedSize;
 }
 
+/// Accessor to \ref ImageDataSize
+size_t File::GetImageDataSize()
+{
+   if ( ! GetDecompressed() )
+   {
+      // If the decompression failed nothing can be done.
+      return 0;
+   }
+                                                                                
+   if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() )
+   {
+      return PixelConverter->GetRGBSize();
+   }
+   else
+   {
+      // When no LUT or LUT conversion fails, return the decompressed
+      return PixelConverter->GetDecompressedSize();
+   }
+}
+
+/// Accessor to \ref ImageDataSizeRaw
+size_t File::GetImageDataSizeRaw()
+{
+   if ( ! GetDecompressed() )
+   {
+      // If the decompression failed nothing can be done.
+      return 0;
+   }
+   return PixelConverter->GetDecompressedSize();
+}
+
 /**
  * \brief   - Allocates necessary memory, 
  *          - Reads the pixels from disk (uncompress if necessary),
@@ -218,82 +249,6 @@ uint8_t* File::GetImageData()
       // When no LUT or LUT conversion fails, return the decompressed
       return PixelConverter->GetDecompressed();
    }
-   
-/*   if ( ! GetDecompressed() )
-   {
-      // If the decompression failed nothing can be done.
-      return 0;
-   }
-                                                                                
-   uint8_t* pixelData;
-   if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() )
-   {
-      pixelData = PixelConverter->GetRGB();
-   }
-   else
-   {
-      // When no LUT or LUT conversion fails, return the decompressed
-      pixelData = PixelConverter->GetDecompressed();
-   }
-
-// PIXELCONVERT CLEANME
-   // Restore the header in a disk-consistent state
-   // (if user asks twice to get the pixels from disk)
-   if ( PixelRead != -1 ) // File was "read" before
-   {
-      RestoreInitialValues();
-   }
-   if ( PixelConverter->GetRGB() )
-   {
-      // now, it's an RGB image
-      // Lets's write it in the Header
-      std::string spp = "3";        // Samples Per Pixel
-      HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
-      std::string rgb = "RGB ";     // Photometric Interpretation
-      HeaderInternal->SetEntryByNumber(rgb,0x0028,0x0004);
-      std::string planConfig = "0"; // Planar Configuration
-      HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
-      PixelRead = 0; // no PixelRaw
-   }
-   else
-   {
-      if ( HeaderInternal->HasLUT() )
-      {
-         // The LUT interpretation failed
-         std::string photometricInterpretation = Util::DicomString("MONOCHROME1");
-         HeaderInternal->SetEntryByNumber( photometricInterpretation,
-                                           0x0028, 0x0004 );
-         PixelRead = 0; // no PixelRaw
-      }
-      else
-      {
-         if ( PixelConverter->IsDecompressedRGB() )
-         {
-            ///////////////////////////////////////////////////
-            // now, it's an RGB image
-            // Lets's write it in the Header
-            // Droping Palette Color out of the Header
-            // has been moved to the Write process.
-            // TODO : move 'values' modification to the write process
-            //      : save also (in order to be able to restore)
-            //      : 'high bit' -when not equal to 'bits stored' + 1
-            //      : 'bits allocated', when it's equal to 12 ?!
-            std::string spp = "3";            // Samples Per Pixel
-            std::string photInt = "RGB ";     // Photometric Interpretation
-            std::string planConfig = "0";     // Planar Configuration
-            HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
-            HeaderInternal->SetEntryByNumber(photInt,0x0028,0x0004);
-            HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
-         }
-         PixelRead = 1; // PixelRaw
-      } 
-   }
-
-   // We say the value *is* loaded.
-   SetPixelData(pixelData);
-// END PIXELCONVERT CLEANME
-
-   return pixelData;*/
 }
 
 /**
@@ -368,45 +323,6 @@ size_t File::GetImageDataIntoVector (void* destination, size_t maxSize)
 uint8_t* File::GetImageDataRaw ()
 {
    return GetDecompressed();
-/*   uint8_t* decompressed = GetDecompressed();
-   if ( ! decompressed )
-   {
-      return 0;
-   }
-
-// PIXELCONVERT CLEANME
-   // Restore the header in a disk-consistent state
-   // (if user asks twice to get the pixels from disk)
-   if ( PixelRead != -1 ) // File was "read" before
-   {
-      RestoreInitialValues();
-   }
-   if ( PixelConverter->IsDecompressedRGB() )
-   {
-      ///////////////////////////////////////////////////
-      // now, it's an RGB image
-      // Lets's write it in the Header
-      // Droping Palette Color out of the Header
-      // has been moved to the Write process.
-      // TODO : move 'values' modification to the write process
-      //      : save also (in order to be able to restore)
-      //      : 'high bit' -when not equal to 'bits stored' + 1
-      //      : 'bits allocated', when it's equal to 12 ?!
-      std::string spp = "3";            // Samples Per Pixel
-      std::string photInt = "RGB ";     // Photometric Interpretation
-      std::string planConfig = "0";     // Planar Configuration
-      HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
-      HeaderInternal->SetEntryByNumber(photInt,0x0028,0x0004);
-      HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
-   }
-
-   // We say the value *is* loaded.
-   SetPixelData(decompressed);
-   PixelRead = 1; // PixelRaw
-// END PIXELCONVERT CLEANME
-
-   return decompressed;*/
 }
 
 uint8_t* File::GetDecompressed()
@@ -565,15 +481,6 @@ bool File::WriteBase (std::string const & fileName, FileType type)
       return false;
    }
 
-   if ( type == ImplicitVR || type == ExplicitVR )
-   {
-      // writing Dicom File Preamble
-      char filePreamble[128];
-      memset(filePreamble, 0, 128);
-      fp1->write(filePreamble, 128);
-      fp1->write("DICM", 4);
-   }
-
    switch(WriteMode)
    {
       case WMODE_NATIVE :
@@ -593,33 +500,13 @@ bool File::WriteBase (std::string const & fileName, FileType type)
    // if recognition code tells us we dealt with a LibIDO image
    // we reproduce on disk the switch between lineNumber and columnNumber
    // just before writting ...
-   
    /// \todo the best trick would be *change* the recognition code
    ///       but pb expected if user deals with, e.g. COMPLEX images
-
-   std::string rows, columns; 
-   if ( HeaderInternal->GetFileType() == ACR_LIBIDO)
+/*   if ( HeaderInternal->GetFileType() == ACR_LIBIDO)
    {
       SetWriteToLibido();
-   }
-   // ----------------- End of Special Patch ----------------
-      
-/*   uint16_t grPixel  = HeaderInternal->GetGrPixel();
-   uint16_t numPixel = HeaderInternal->GetNumPixel();;
-          
-   DocEntry* PixelElement = 
-      GetHeader()->GetDocEntryByNumber(grPixel, numPixel);  
-   if ( PixelRead == 1 )
-   {
-      // we read pixel 'as is' (no tranformation LUT -> RGB)
-      PixelElement->SetLength( ImageDataSizeRaw );
-   }
-   else if ( PixelRead == 0 )
-   {
-      // we tranformed GrayLevel pixels + LUT into RGB Pixel
-      PixelElement->SetLength( ImageDataSize );
    }*/
+   // ----------------- End of Special Patch ----------------
  
    HeaderInternal->Write(fp1, type);
 
@@ -628,11 +515,10 @@ bool File::WriteBase (std::string const & fileName, FileType type)
    // 
    // ...and we restore the Header to be Dicom Compliant again 
    // just after writting
-
-   if ( HeaderInternal->GetFileType() == ACR_LIBIDO )
+/*   if ( HeaderInternal->GetFileType() == ACR_LIBIDO )
    {
       RestoreWriteFromLibido();
-   }
+   }*/
    // ----------------- End of Special Patch ----------------
 
    RestoreWrite();
@@ -679,56 +565,104 @@ void File::SetWriteToNative()
 
 void File::SetWriteToDecompressed()
 {
-//   if (( !HeaderInternal->HasLUT() ) || (!PixelConverter->BuildRGBImage()))
-   if(HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage())
+   if(HeaderInternal->GetNumberOfScalarComponents()==3 && !HeaderInternal->HasLUT())
    {
       SetWriteToRGB();
    } 
    else
    {
       ValEntry* photInt = CopyValEntry(0x0028,0x0004);
-      photInt->SetValue("MONOCHROME1 ");
-      photInt->SetLength(12);
+      if(HeaderInternal->HasLUT())
+      {
+         photInt->SetValue("PALETTE COLOR ");
+         photInt->SetLength(14);
+      }
+      else
+      {
+         photInt->SetValue("MONOCHROME1 ");
+         photInt->SetLength(12);
+      }
 
       BinEntry* pixel = CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
       pixel->SetValue(GDCM_BINLOADED);
-      pixel->SetBinArea(PixelConverter->GetDecompressed(),false);
-      pixel->SetLength(PixelConverter->GetDecompressedSize());
+      if(Pixel_Data)
+      {
+         pixel->SetBinArea(Pixel_Data,false);
+         pixel->SetLength(ImageDataSize);
+      }
+      else
+      {
+         pixel->SetBinArea(PixelConverter->GetDecompressed(),false);
+         pixel->SetLength(PixelConverter->GetDecompressedSize());
+      }
 
       Archive->Push(photInt);
       Archive->Push(pixel);
    }
-/*   else 
-   {
-      SetWriteToRGB();
-   } */
 }
 
 void File::SetWriteToRGB()
 {
-   if(PixelConverter->BuildRGBImage())
+   if(HeaderInternal->GetNumberOfScalarComponents()==3 && !HeaderInternal->HasLUT())
    {
+      PixelConverter->BuildRGBImage();
+      
       ValEntry* spp = CopyValEntry(0x0028,0x0002);
       spp->SetValue("3 ");
       spp->SetLength(2);
 
-      ValEntry* photInt = CopyValEntry(0x0028,0x0004);
-      photInt->SetValue("RGB ");
-      photInt->SetLength(4);
-
       ValEntry* planConfig = CopyValEntry(0x0028,0x0006);
       planConfig->SetValue("0 ");
       planConfig->SetLength(2);
 
+      ValEntry* photInt = CopyValEntry(0x0028,0x0004);
+      photInt->SetValue("RGB ");
+      photInt->SetLength(4);
+
       BinEntry* pixel = CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
       pixel->SetValue(GDCM_BINLOADED);
-      pixel->SetBinArea(PixelConverter->GetRGB(),false);
-      pixel->SetLength(PixelConverter->GetRGBSize());
+      if(Pixel_Data)
+      {
+         pixel->SetBinArea(Pixel_Data,false);
+         pixel->SetLength(ImageDataSize);
+      }
+      else if(PixelConverter->GetRGB())
+      {
+         pixel->SetBinArea(PixelConverter->GetRGB(),false);
+         pixel->SetLength(PixelConverter->GetRGBSize());
+      }
+      else // Decompressed data
+      {
+         pixel->SetBinArea(PixelConverter->GetDecompressed(),false);
+         pixel->SetLength(PixelConverter->GetDecompressedSize());
+      }
 
       Archive->Push(spp);
-      Archive->Push(photInt);
       Archive->Push(planConfig);
+      Archive->Push(photInt);
       Archive->Push(pixel);
+
+      // For old ACR-NEMA
+      // Thus, we have a RGB image and the bits allocated = 24 and 
+      // samples per pixels = 1 (in the read file)
+      if(HeaderInternal->GetBitsAllocated()==24) 
+      {
+         ValEntry* bitsAlloc = CopyValEntry(0x0028,0x0100);
+         bitsAlloc->SetValue("8 ");
+         bitsAlloc->SetLength(2);
+
+         ValEntry* bitsStored = CopyValEntry(0x0028,0x0101);
+         bitsStored->SetValue("8 ");
+         bitsStored->SetLength(2);
+
+         ValEntry* highBit = CopyValEntry(0x0028,0x0102);
+         highBit->SetValue("7 ");
+         highBit->SetLength(2);
+
+         Archive->Push(bitsAlloc);
+         Archive->Push(bitsStored);
+         Archive->Push(highBit);
+      }
    }
    else
    {
@@ -742,6 +676,11 @@ void File::RestoreWrite()
    Archive->Restore(0x0028,0x0004);
    Archive->Restore(0x0028,0x0006);
    Archive->Restore(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
+
+   // For old ACR-NEMA (24 bits problem)
+   Archive->Restore(0x0028,0x0100);
+   Archive->Restore(0x0028,0x0101);
+   Archive->Restore(0x0028,0x0102);
 }
 
 void File::SetWriteToLibido()
index 8ed3171fe7af2834b8a043b1027ff2f5967c604a..43b6f736f5f7c8a71808ed207eb48550dd425639 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.h,v $
   Language:  C++
-  Date:      $Date: 2004/11/24 10:23:47 $
-  Version:   $Revision: 1.74 $
+  Date:      $Date: 2004/11/24 16:39:18 $
+  Version:   $Revision: 1.75 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -59,10 +59,9 @@ public:
    Header* GetHeader() { return HeaderInternal; }
 
    /// Accessor to \ref ImageDataSize
-   size_t GetImageDataSize() { return ImageDataSize; };
-
+   size_t GetImageDataSize();
    /// Accessor to \ref ImageDataSizeRaw
-   size_t GetImageDataSizeRaw() { return ImageDataSizeRaw; };
+   size_t GetImageDataSizeRaw();
 
    /// Accessor to \ref PixelConverter
    PixelConvert* GetPixelConverter() { return PixelConverter; };
index 166fd40a7e93247d13bed96db53da4365ecf0cb0..01f783325508d62fe67b9b8686a5ec8a0f42f3f2 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSQItem.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/10 18:27:23 $
-  Version:   $Revision: 1.36 $
+  Date:      $Date: 2004/11/24 16:39:19 $
+  Version:   $Revision: 1.37 $
   
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -60,6 +60,7 @@ SQItem::~SQItem()
  */
  void SQItem::Print(std::ostream& os)
  {
+   os << "S ";
    std::ostringstream s;
 
    if (SQDepthLevel > 0)
index 2a7d748d3de136437ca9bbad6a4a9ffe7de5edfa..a0e53cfe0043d24e5e66a396d56b49cd23731f9a 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSeqEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/19 12:44:00 $
-  Version:   $Revision: 1.36 $
+  Date:      $Date: 2004/11/24 16:39:19 $
+  Version:   $Revision: 1.37 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -85,6 +85,8 @@ void SeqEntry::Print( std::ostream &os )
 {
    // First, Print the Dicom Element itself.
    SetPrintLevel(2);   
+
+   os << "S ";
    DocEntry::Print(os);
    os << std::endl;
 
index 8781df1ec86ad99f503f3a09ee71f1ad67a40622..673f9489ae023b6bdfbc1f2adc003998d0264af6 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmValEntry.cxx,v $
   Language:  C++
-  Date:      $Date: 2004/11/16 16:49:01 $
-  Version:   $Revision: 1.36 $
+  Date:      $Date: 2004/11/24 16:39:19 $
+  Version:   $Revision: 1.37 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -76,6 +76,7 @@ void ValEntry::Print(std::ostream & os)
    TSKey v;
    std::string d2;
      
+   os << "V ";
    DocEntry::Print(os); 
 
    if (g == 0xfffe)