]> Creatis software - gdcm.git/commitdiff
ENH: Getting toward a nice gdcmDecompressor. Now RLE and JPEG are getting similar...
authormalaterre <malaterre>
Mon, 31 Jan 2005 05:24:21 +0000 (05:24 +0000)
committermalaterre <malaterre>
Mon, 31 Jan 2005 05:24:21 +0000 (05:24 +0000)
src/gdcmJPEGFragmentsInfo.cxx
src/gdcmJPEGFragmentsInfo.h
src/gdcmPixelReadConvert.cxx
src/gdcmPixelReadConvert.h
src/gdcmRLEFrame.h
src/gdcmRLEFramesInfo.cxx
src/gdcmRLEFramesInfo.h
vtk/vtkgdcmViewer.cxx

index b76548b94662da8130bfb3fac3baee360b09a888..6fcd14ef7d1c230dffebb9e1d1a331dc09014e59 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmJPEGFragmentsInfo.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 04:15:33 $
-  Version:   $Revision: 1.16 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  Version:   $Revision: 1.17 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -69,7 +69,7 @@ void JPEGFragmentsInfo::Print( std::ostream &os, std::string const &indent )
    os << std::endl;
 }
 
-void JPEGFragmentsInfo::DecompressJPEGFramesFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int , int )
+void JPEGFragmentsInfo::DecompressFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int , int )
 {
    // Pointer to the Raw image
    uint8_t *localRaw = buffer;
index 0a09573fed59a863335f959ba3469ab891812a29..9b4b0fddf2529cf3dbbd7354d7e6084b50d114b4 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmJPEGFragmentsInfo.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 04:15:33 $
-  Version:   $Revision: 1.18 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  Version:   $Revision: 1.19 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -44,7 +44,7 @@ public:
    ~JPEGFragmentsInfo();
    void Print( std::ostream &os = std::cout, std::string const & indent = "" );
 
-   void DecompressJPEGFramesFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int numBytes, int length);
+   void DecompressFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int numBytes, int length);
 
    void AddFragment(JPEGFragment *fragment);
    JPEGFragment *GetFirstFragment();
index 6522520099437524bb7af3ff436318976f747fbb..1536ad4a4fb1c8ceaa09fb65d2086e084e7edd2a 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 04:15:33 $
-  Version:   $Revision: 1.40 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  Version:   $Revision: 1.41 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -129,144 +129,6 @@ void PixelReadConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream *fp )
    }
 }
 
-/**
- * \brief     Try to deal with RLE 16 Bits. 
- *            We assume the RLE has already been parsed and loaded in
- *            Raw (through \ref ReadAndDecompressJPEGFile ).
- *            We here need to make 16 Bits Pixels from Low Byte and
- *            High Byte 'Planes'...(for what it may mean)
- * @return    Boolean
- */
-bool PixelReadConvert::DecompressRLE16BitsFromRLE8Bits( int NumberOfFrames )
-{
-   size_t pixelNumber = XSize * YSize;
-   size_t rawSize = XSize * YSize * NumberOfFrames;
-
-   // We assumed Raw contains the decoded RLE pixels but as
-   // 8 bits per pixel. In order to convert those pixels to 16 bits
-   // per pixel we cannot work in place within Raw and hence
-   // we copy it in a safe place, say copyRaw.
-
-   uint8_t* copyRaw = new uint8_t[rawSize * 2];
-   memmove( copyRaw, Raw, rawSize * 2 );
-
-   uint8_t* x = Raw;
-   uint8_t* a = copyRaw;
-   uint8_t* b = a + pixelNumber;
-
-   for ( int i = 0; i < NumberOfFrames; i++ )
-   {
-      for ( unsigned int j = 0; j < pixelNumber; j++ )
-      {
-         *(x++) = *(b++);
-         *(x++) = *(a++);
-      }
-   }
-
-   delete[] copyRaw;
-      
-   /// \todo check that operator new []didn't fail, and sometimes return false
-   return true;
-}
-
-/**
- * \brief Implementation of the RLE decoding algorithm for decompressing
- *        a RLE fragment. [refer to PS 3.5-2003, section G.3.2 p 86]
- * @param subRaw Sub region of \ref Raw where the decoded fragment
- *        should be placed.
- * @param fragmentSize The length of the binary fragment as found on the disk.
- * @param RawSegmentSize The expected length of the fragment ONCE
- *        Raw.
- * @param fp File Pointer: on entry the position should be the one of
- *        the fragment to be decoded.
- */
-bool PixelReadConvert::ReadAndDecompressRLEFragment( uint8_t *subRaw,
-                                                 long fragmentSize,
-                                                 long RawSegmentSize,
-                                                 std::ifstream *fp )
-{
-   int8_t count;
-   long numberOfOutputBytes = 0;
-   long numberOfReadBytes = 0;
-
-   while( numberOfOutputBytes < RawSegmentSize )
-   {
-      fp->read( (char*)&count, 1 );
-      numberOfReadBytes += 1;
-      if ( count >= 0 )
-      // Note: count <= 127 comparison is always true due to limited range
-      //       of data type int8_t [since the maximum of an exact width
-      //       signed integer of width N is 2^(N-1) - 1, which for int8_t
-      //       is 127].
-      {
-         fp->read( (char*)subRaw, count + 1);
-         numberOfReadBytes   += count + 1;
-         subRaw     += count + 1;
-         numberOfOutputBytes += count + 1;
-      }
-      else
-      {
-         if ( ( count <= -1 ) && ( count >= -127 ) )
-         {
-            int8_t newByte;
-            fp->read( (char*)&newByte, 1);
-            numberOfReadBytes += 1;
-            for( int i = 0; i < -count + 1; i++ )
-            {
-               subRaw[i] = newByte;
-            }
-            subRaw     += -count + 1;
-            numberOfOutputBytes += -count + 1;
-         }
-      }
-      // if count = 128 output nothing
-                                                                                
-      if ( numberOfReadBytes > fragmentSize )
-      {
-         gdcmVerboseMacro( "Read more bytes than the segment size.");
-         return false;
-      }
-   }
-   return true;
-}
-
-/**
- * \brief     Reads from disk the Pixel Data of 'Run Length Encoded'
- *            Dicom encapsulated file and decompress it.
- * @param     fp already open File Pointer
- *            at which the pixel data should be copied
- * @return    Boolean
- */
-bool PixelReadConvert::ReadAndDecompressRLEFile( std::ifstream *fp )
-{
-   uint8_t *subRaw = Raw;
-   long RawSegmentSize = XSize * YSize;
-
-   // Loop on the frame[s]
-   RLEFrame *frame = RLEInfo->GetFirstFrame();
-   while( frame )
-   {
-      // Loop on the fragments
-      for( unsigned int k = 1; k <= frame->GetNumberOfFragments(); k++ )
-      {
-         fp->seekg(frame->GetOffset(k),std::ios::beg);
-         ReadAndDecompressRLEFragment(subRaw,
-                                      frame->GetLength(k),
-                                      RawSegmentSize, 
-                                      fp);
-         subRaw += RawSegmentSize;
-      }
-      frame = RLEInfo->GetNextFrame();
-   }
-
-   if ( BitsAllocated == 16 )
-   {
-      // Try to deal with RLE 16 Bits
-      (void)DecompressRLE16BitsFromRLE8Bits( ZSize );
-   }
-
-   return true;
-}
 
 /**
  * \brief Swap the bytes, according to \ref SwapCode.
@@ -398,7 +260,7 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
    int length = XSize * YSize * SamplesPerPixel;
    int numberBytes = BitsAllocated / 8;
 
-   JPEGInfo->DecompressJPEGFramesFromFile(fp, Raw, BitsStored, numberBytes, length );
+   JPEGInfo->DecompressFromFile(fp, Raw, BitsStored, numberBytes, length );
    return true;
 }
 
@@ -578,7 +440,7 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    } 
    else if ( IsRLELossless )
    {
-      if ( ! ReadAndDecompressRLEFile( fp ) )
+      if ( ! RLEInfo->ReadAndDecompressRLEFile( fp, Raw, XSize, YSize, ZSize, BitsAllocated ) )
       {
          gdcmVerboseMacro( "RLE decompressor failed." );
          return false;
index 047d31939d215b3475fc4ffea9c5c1a1d9996931..aea3ec34a208a79997301f8e49a6a75433954460 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 03:22:26 $
-  Version:   $Revision: 1.15 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  Version:   $Revision: 1.16 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -60,13 +60,7 @@ public:
 
 private:
    // Use the fp:
-   bool ReadAndDecompressRLEFragment(
-                  uint8_t *subDecompressed,
-                  long fragmentSize,
-                  long decompressedSegmentSize,
-                  std::ifstream *fp );
    void ReadAndDecompress12BitsTo16Bits( std::ifstream *fp ) throw ( FormatError );
-   bool ReadAndDecompressRLEFile( std::ifstream *fp );
    bool ReadAndDecompressJPEGFile( std::ifstream *fp );
 
    void BuildLUTRGBA( std::ifstream *fp );
@@ -74,7 +68,6 @@ private:
    // In place (within Decompressed and with no fp access) decompression
    // or convertion:
    void BuildLUTRGBA();
-   bool DecompressRLE16BitsFromRLE8Bits( int NumberOfFrames );
    void ConvertSwapZone();
    void ConvertReorderEndianity();
    bool ConvertReArrangeBits() throw ( FormatError );
index adac8f923b5b0fe9b1cd9df833e736bfa16f5c8f..ac8eac93f16315e92330a320f79d9747f4f45125 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmRLEFrame.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/26 11:42:02 $
-  Version:   $Revision: 1.12 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  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
@@ -50,9 +50,9 @@ public:
 
    void SetNumberOfFragments(unsigned int number) { NumberFragments = number; };   
    unsigned int GetNumberOfFragments() { return NumberFragments; };
-   void SetOffset(unsigned int id,long offset);
+   void SetOffset(unsigned int id, long offset);
    long GetOffset(unsigned int id);
-   void SetLength(unsigned int id,long length);
+   void SetLength(unsigned int id, long length);
    long GetLength(unsigned int id);
 
 private:
index 7fece3c5c2ede39a26d9fba2f23df1986e9ddf99..6f9aed23134f5141fad4b0942dca9ae92030a9b2 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmRLEFramesInfo.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 04:15:33 $
-  Version:   $Revision: 1.8 $
+  Date:      $Date: 2005/01/31 05:24:21 $
+  Version:   $Revision: 1.9 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -78,4 +78,142 @@ RLEFrame *RLEFramesInfo::GetNextFrame()
    return NULL;
 }
 
+/**
+ * \brief     Reads from disk the Pixel Data of 'Run Length Encoded'
+ *            Dicom encapsulated file and decompress it.
+ * @param     fp already open File Pointer
+ *            at which the pixel data should be copied
+ * @return    Boolean
+ */
+bool RLEFramesInfo::ReadAndDecompressRLEFile( std::ifstream *fp , uint8_t *raw, int xSize, int ySize, int zSize, int bitsAllocated )
+{
+   uint8_t *subRaw = raw;
+   long RawSegmentSize = xSize * ySize;
+
+   // Loop on the frame[s]
+   for(RLEFrameList::iterator it = Frames.begin(); it != Frames.end(); ++it)
+   {
+      // Loop on the fragments
+      for( unsigned int k = 1; k <= (*it)->GetNumberOfFragments(); k++ )
+      {
+         fp->seekg((*it)->GetOffset(k),std::ios::beg);
+         ReadAndDecompressRLEFragment(subRaw,
+                                      (*it)->GetLength(k),
+                                      RawSegmentSize, 
+                                      fp);
+         subRaw += RawSegmentSize;
+      }
+   }
+
+   if ( bitsAllocated == 16 )
+   {
+      // Try to deal with RLE 16 Bits
+      (void)DecompressRLE16BitsFromRLE8Bits( raw, xSize, ySize, zSize );
+   }
+
+   return true;
+}
+
+/**
+ * \brief Implementation of the RLE decoding algorithm for decompressing
+ *        a RLE fragment. [refer to PS 3.5-2003, section G.3.2 p 86]
+ * @param subRaw Sub region of \ref Raw where the decoded fragment
+ *        should be placed.
+ * @param fragmentSize The length of the binary fragment as found on the disk.
+ * @param RawSegmentSize The expected length of the fragment ONCE
+ *        Raw.
+ * @param fp File Pointer: on entry the position should be the one of
+ *        the fragment to be decoded.
+ */
+bool RLEFramesInfo::ReadAndDecompressRLEFragment( uint8_t *subRaw,
+                                                 long fragmentSize,
+                                                 long RawSegmentSize,
+                                                 std::ifstream *fp )
+{
+   int8_t count;
+   long numberOfOutputBytes = 0;
+   long numberOfReadBytes = 0;
+
+   while( numberOfOutputBytes < RawSegmentSize )
+   {
+      fp->read( (char*)&count, 1 );
+      numberOfReadBytes += 1;
+      if ( count >= 0 )
+      // Note: count <= 127 comparison is always true due to limited range
+      //       of data type int8_t [since the maximum of an exact width
+      //       signed integer of width N is 2^(N-1) - 1, which for int8_t
+      //       is 127].
+      {
+         fp->read( (char*)subRaw, count + 1);
+         numberOfReadBytes   += count + 1;
+         subRaw     += count + 1;
+         numberOfOutputBytes += count + 1;
+      }
+      else
+      {
+         if ( count <= -1 && count >= -127 )
+         {
+            int8_t newByte;
+            fp->read( (char*)&newByte, 1);
+            numberOfReadBytes += 1;
+            for( int i = 0; i < -count + 1; i++ )
+            {
+               subRaw[i] = newByte;
+            }
+            subRaw     += -count + 1;
+            numberOfOutputBytes += -count + 1;
+         }
+      }
+      // if count = 128 output nothing
+                                                                                
+      if ( numberOfReadBytes > fragmentSize )
+      {
+         gdcmVerboseMacro( "Read more bytes than the segment size.");
+         return false;
+      }
+   }
+   return true;
+}
+
+/**
+ * \brief     Try to deal with RLE 16 Bits. 
+ *            We assume the RLE has already been parsed and loaded in
+ *            Raw (through \ref ReadAndDecompressJPEGFile ).
+ *            We here need to make 16 Bits Pixels from Low Byte and
+ *            High Byte 'Planes'...(for what it may mean)
+ * @return    Boolean
+ */
+bool RLEFramesInfo::DecompressRLE16BitsFromRLE8Bits( uint8_t* raw, int xSize, int ySize,int numberOfFrames  )
+{
+   size_t pixelNumber = xSize * ySize;
+   size_t rawSize = xSize * ySize * numberOfFrames;
+
+   // We assumed Raw contains the decoded RLE pixels but as
+   // 8 bits per pixel. In order to convert those pixels to 16 bits
+   // per pixel we cannot work in place within Raw and hence
+   // we copy it in a safe place, say copyRaw.
+
+   uint8_t* copyRaw = new uint8_t[rawSize * 2];
+   memmove( copyRaw, raw, rawSize * 2 );
+
+   uint8_t* x = raw;
+   uint8_t* a = copyRaw;
+   uint8_t* b = a + pixelNumber;
+
+   for ( int i = 0; i < numberOfFrames; i++ )
+   {
+      for ( unsigned int j = 0; j < pixelNumber; j++ )
+      {
+         *(x++) = *(b++);
+         *(x++) = *(a++);
+      }
+   }
+
+   delete[] copyRaw;
+      
+   /// \todo check that operator new []didn't fail, and sometimes return false
+   return true;
+}
+
+
 } // end namespace gdcm
index d5fad91e9defccf9c077a28987379f8760739d59..27c42287f955522e7f278f6f929a9a37a6a6b41e 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmRLEFramesInfo.h,v $
   Language:  C++
-  Date:      $Date: 2005/01/31 04:15:33 $
-  Version:   $Revision: 1.15 $
+  Date:      $Date: 2005/01/31 05:24:22 $
+  Version:   $Revision: 1.16 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -45,6 +45,13 @@ class GDCM_EXPORT RLEFramesInfo
 public:
    ~RLEFramesInfo();
    void Print( std::ostream &os = std::cout, std::string indent = "" );
+   bool ReadAndDecompressRLEFile( std::ifstream *fp, uint8_t *subRaw, int xSize, int ySize, int zSize, int bitsAllocated );
+   bool ReadAndDecompressRLEFragment(
+                  uint8_t *subDecompressed,
+                  long fragmentSize,
+                  long decompressedSegmentSize,
+                  std::ifstream *fp );
+   bool DecompressRLE16BitsFromRLE8Bits( uint8_t* subRaw, int xSize, int ySize, int NumberOfFrames );
 
    void AddFrame(RLEFrame *frame);
 
index d70d49447f1f26a10cf5b0387e509568f72b21b2..9e1b6a5993dfbd0d69f4314b36f4d7166d06421f 100644 (file)
@@ -15,7 +15,7 @@
 #include <iostream>
 
 #include <vtkRenderWindowInteractor.h>
-#include <vtkImageViewer2.h>
+#include <vtkImageViewer.h>
 #include <vtkStructuredPoints.h>
 #include <vtkStructuredPointsWriter.h>
 #include <vtkCommand.h>
@@ -60,7 +60,7 @@ public:
          }
       }
    }
-   vtkImageViewer2 *ImageViewer;
+   vtkImageViewer *ImageViewer;
 };
 
 
@@ -85,7 +85,7 @@ int main(int argc, char *argv[])
 
    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
 
-   vtkImageViewer2 *viewer = vtkImageViewer2::New();
+   vtkImageViewer *viewer = vtkImageViewer::New();
 
    if( reader->GetLookupTable() )
    {
@@ -117,6 +117,7 @@ int main(int argc, char *argv[])
    iren->AddObserver(vtkCommand::CharEvent,obs);
    obs->Delete();
 
+   //viewer->Render();
    iren->Initialize();
    iren->Start();