Program: gdcm
Module: $RCSfile: gdcmPixelReadConvert.cxx,v $
Language: C++
- Date: $Date: 2005/01/26 16:28:58 $
- Version: $Revision: 1.36 $
+ Date: $Date: 2005/01/31 03:22:26 $
+ 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
long RawSegmentSize = XSize * YSize;
// Loop on the frame[s]
- for( RLEFramesInfo::RLEFrameList::iterator
- it = RLEInfo->Frames.begin();
- it != RLEInfo->Frames.end();
- ++it )
+ RLEFrame *frame = RLEInfo->GetFirstFrame();
+ while( frame )
{
// Loop on the fragments
- for( unsigned int k = 1; k <= (*it)->GetNumberOfFragments(); k++ )
+ for( unsigned int k = 1; k <= frame->GetNumberOfFragments(); k++ )
{
- fp->seekg( (*it)->GetOffset(k) , std::ios::beg );
- (void)ReadAndDecompressRLEFragment( subRaw,
- (*it)->GetLength(k),
- RawSegmentSize,
- fp );
+ fp->seekg(frame->GetOffset(k),std::ios::beg);
+ ReadAndDecompressRLEFragment(subRaw,
+ frame->GetLength(k),
+ RawSegmentSize,
+ fp);
subRaw += RawSegmentSize;
}
+ frame = RLEInfo->GetNexttFrame();
}
if ( BitsAllocated == 16 )
}
}
-
-/**
- * \brief Reads from disk the Pixel Data of JPEG Dicom encapsulated
- * file and decompress it. This function assumes that each
- * jpeg fragment contains a whole frame (jpeg file).
- * @param fp File Pointer
- * @return Boolean
- */
-bool PixelReadConvert::ReadAndDecompressJPEGFramesFromFile( std::ifstream *fp )
-{
- // Pointer to the Raw image
- //uint8_t *localRaw = Raw;
-
- // Precompute the offset localRaw will be shifted with
- int length = XSize * YSize * SamplesPerPixel;
- int numberBytes = BitsAllocated / 8;
-
-// // Loop on the fragment[s]
-// for( JPEGFragmentsInfo::JPEGFragmentsList::iterator
-// it = JPEGInfo->Fragments.begin();
-// it != JPEGInfo->Fragments.end();
-// ++it )
-// {
-// (*it)->DecompressJPEGFramesFromFile(fp, localRaw, BitsStored );
-//
-// // Advance to next free location in Raw
-// // for next fragment decompression (if any)
-//
-// localRaw += length * numberBytes;
-// }
- JPEGInfo->DecompressJPEGFramesFromFile(fp, Raw, BitsStored, numberBytes, length );
- return true;
-}
-
-/**
- * \brief Reads from disk the Pixel Data of JPEG Dicom encapsulated
- * file and decompress it. This function assumes that the dicom
- * image is a single frame split into several JPEG fragments.
- * Those fragments will be glued together into a memory buffer
- * before being read.
- * @param fp File Pointer
- * @return Boolean
- */
-bool PixelReadConvert::
-ReadAndDecompressJPEGSingleFrameFragmentsFromFile( std::ifstream *fp )
-{
- // Loop on the fragment[s] to get total length
- size_t totalLength = JPEGInfo->GetFragmentsLength();
-
- // Concatenate the jpeg fragments into a local buffer
- JOCTET *buffer = new JOCTET [totalLength];
- // Fill in the buffer:
- JPEGInfo->ReadAllFragments(fp, buffer);
-
- // kludge: // FIXME
- JPEGFragmentsInfo::JPEGFragmentsList::const_iterator it = JPEGInfo->Fragments.begin();
- (*it)->DecompressJPEGSingleFrameFragmentsFromFile(buffer, totalLength, Raw, BitsStored);
-
- // free local buffer
- delete [] buffer;
-
- return true;
-}
-
-/**
- * \brief Reads from disk the Pixel Data of JPEG Dicom encapsulated
- * file and decompress it. This function handles the generic
- * and complex case where the DICOM contains several frames,
- * and some of the frames are possibly split into several JPEG
- * fragments.
- * @param fp File Pointer
- * @return Boolean
- */
-bool PixelReadConvert::
-ReadAndDecompressJPEGFragmentedFramesFromFile( std::ifstream *fp )
-{
- // Loop on the fragment[s] to get total length
- size_t totalLength = JPEGInfo->GetFragmentsLength();
-
- // Concatenate the jpeg fragments into a local buffer
- JOCTET *buffer = new JOCTET [totalLength];
- // Fill in the buffer:
- JPEGInfo->ReadAllFragments(fp, buffer);
-
- size_t howManyRead = 0;
- size_t howManyWritten = 0;
- size_t fragmentLength = 0;
-
- JPEGFragmentsInfo::JPEGFragmentsList::const_iterator it;
- for( it = JPEGInfo->Fragments.begin() ;
- (it != JPEGInfo->Fragments.end()) && (howManyRead < totalLength);
- ++it )
- {
- fragmentLength += (*it)->GetLength();
-
- if (howManyRead > fragmentLength) continue;
-
- (*it)->DecompressJPEGFragmentedFramesFromFile(buffer, Raw, BitsStored, howManyRead, howManyWritten, totalLength);
-
- if (howManyRead < fragmentLength)
- howManyRead = fragmentLength;
- }
-
- // free local buffer
- delete [] buffer;
-
- return true;
-}
-
/**
* \brief Reads from disk the Pixel Data of JPEG Dicom encapsulated
* file and decompress it.
if ( IsJPEG2000 )
{
gdcmVerboseMacro( "Sorry, JPEG2000 not yet taken into account" );
- fp->seekg( (*JPEGInfo->Fragments.begin())->GetOffset(), std::ios::beg);
+ fp->seekg( JPEGInfo->GetFirstFragment()->GetOffset(), std::ios::beg);
// if ( ! gdcm_read_JPEG2000_file( fp,Raw ) )
- gdcmVerboseMacro( "Wrong Blue LUT descriptor" );
return false;
}
if ( IsJPEGLS )
{
gdcmVerboseMacro( "Sorry, JPEG-LS not yet taken into account" );
- fp->seekg( (*JPEGInfo->Fragments.begin())->GetOffset(), std::ios::beg);
+ fp->seekg( JPEGInfo->GetFirstFragment()->GetOffset(), std::ios::beg);
// if ( ! gdcm_read_JPEGLS_file( fp,Raw ) )
return false;
}
- if ( ( ZSize == 1 ) && ( JPEGInfo->Fragments.size() > 1 ) )
- {
- // we have one frame split into several fragments
- // we will pack those fragments into a single buffer and
- // read from it
- return ReadAndDecompressJPEGSingleFrameFragmentsFromFile( fp );
- }
- else if (JPEGInfo->Fragments.size() == (size_t)ZSize)
- {
- }
-// if ( ( ZSize == 1 ) && ( JPEGInfo->Fragments.size() > 1 ) )
-// {
-// // we have one frame split into several fragments
-// // we will pack those fragments into a single buffer and
-// // read from it
-// return ReadAndDecompressJPEGSingleFrameFragmentsFromFile( fp );
-// }
-// else if (JPEGInfo->Fragments.size() == (size_t)ZSize)
-// {
- // suppose each fragment is a frame
- return ReadAndDecompressJPEGFramesFromFile( fp );
-// }
-// else
-// {
-// // The dicom image contains frames containing fragments of images
-// // a more complex algorithm :-)
-// return ReadAndDecompressJPEGFragmentedFramesFromFile( fp );
-// }
+ // else ??
+ // Precompute the offset localRaw will be shifted with
+ int length = XSize * YSize * SamplesPerPixel;
+ int numberBytes = BitsAllocated / 8;
+
+ JPEGInfo->DecompressJPEGFramesFromFile(fp, Raw, BitsStored, numberBytes, length );
+ return true;
}
/**