Program: gdcm
Module: $RCSfile: gdcmPixelConvert.cxx,v $
Language: C++
- Date: $Date: 2004/11/10 16:13:18 $
- Version: $Revision: 1.27 $
+ Date: $Date: 2004/11/30 16:59:32 $
+ Version: $Revision: 1.34 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
{
delete [] RGB;
}
+ RGB = 0;
+
if ( Decompressed )
{
delete [] Decompressed;
}
+ Decompressed = 0;
+
if ( LutRGBA )
{
delete [] LutRGBA;
}
+ LutRGBA = 0;
}
PixelConvert::~PixelConvert()
// Loop on the fragments
for( unsigned int k = 1; k <= (*it)->NumberFragments; k++ )
{
- fp->seekg( (*it)->Offset[k] , std::ios_base::beg );
+ fp->seekg( (*it)->Offset[k] , std::ios::beg );
(void)ReadAndDecompressRLEFragment( subDecompressed,
(*it)->Length[k],
decompressedSegmentSize,
it != JPEGInfo->Fragments.end();
++it )
{
- fp->seekg( (*it)->Offset, std::ios_base::beg);
+ fp->seekg( (*it)->Offset, std::ios::beg);
if ( IsJPEG2000 )
{
bool PixelConvert::ReadAndDecompressPixelData( std::ifstream* fp )
{
- ComputeDecompressedAndRGBSizes();
- AllocateDecompressed();
+ // ComputeDecompressedAndRGBSizes is already made by
+ // ::GrabInformationsFromHeader. So, the structure sizes are
+ // correct
+ Squeeze();
+
//////////////////////////////////////////////////
//// First stage: get our hands on the Pixel Data.
if ( !fp )
return false;
}
- fp->seekg( PixelOffset, std::ios_base::beg );
+ fp->seekg( PixelOffset, std::ios::beg );
if( fp->fail() || fp->eof()) //Fp->gcount() == 1
{
dbg.Verbose( 0, "PixelConvert::ReadAndDecompressPixelData: "
return false;
}
+ AllocateDecompressed();
+
//////////////////////////////////////////////////
//// Second stage: read from disk dans decompress.
if ( BitsAllocated == 12 )
}
else if ( IsDecompressed )
{
+ // This problem can be found when some obvious informations are found
+ // after the field containing the image datas. In this case, these
+ // bad datas are added to the size of the image (in the PixelDataLength
+ // variable). But DecompressedSize is the right size of the image !
if( PixelDataLength != DecompressedSize)
{
dbg.Verbose( 0, "PixelConvert::ReadAndDecompressPixelData: "
{
RGBSize = 3 * DecompressedSize;
}
-
+ else
+ {
+ RGBSize = DecompressedSize;
+ }
}
void PixelConvert::GrabInformationsFromHeader( Header* header )
IsDecompressed =
( ! header->IsDicomV3() )
|| ts == ImplicitVRLittleEndian
+ || ts == ImplicitVRLittleEndianDLXGE
|| ts == ExplicitVRLittleEndian
|| ts == ExplicitVRBigEndian
|| ts == DeflatedExplicitVRLittleEndian;
DocEntry* lutRedDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1201 );
LutRedData = new uint8_t[ lutRedDataEntry->GetLength() ];
- fp->seekg( lutRedDataEntry->GetOffset() ,std::ios_base::beg );
+ fp->seekg( lutRedDataEntry->GetOffset() ,std::ios::beg );
fp->read( (char*)LutRedData, (size_t)lutRedDataEntry->GetLength());
if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read red LUT data" );
- return;
}
}
-
+
////// Green round:
LutGreenData = (uint8_t*)header->GetEntryBinAreaByNumber(0x0028, 0x1202 );
if ( ! LutGreenData)
DocEntry* lutGreenDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1202 );
LutGreenData = new uint8_t[ lutGreenDataEntry->GetLength() ];
- fp->seekg( lutGreenDataEntry->GetOffset() , std::ios_base::beg );
+ fp->seekg( lutGreenDataEntry->GetOffset() , std::ios::beg );
fp->read( (char*)LutGreenData, (size_t)lutGreenDataEntry->GetLength() );
if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read green LUT data" );
- return;
}
}
-
+
////// Blue round:
LutBlueData = (uint8_t*)header->GetEntryBinAreaByNumber( 0x0028, 0x1203 );
if ( ! LutBlueData )
DocEntry* lutBlueDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1203 );
LutBlueData = new uint8_t[ lutBlueDataEntry->GetLength() ];
- fp->seekg( lutBlueDataEntry->GetOffset() , std::ios_base::beg );
+ fp->seekg( lutBlueDataEntry->GetOffset() , std::ios::beg );
fp->read( (char*)LutBlueData, (size_t)lutBlueDataEntry->GetLength() );
if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read blue LUT data" );
- return;
}
}
}
-
- header->CloseFile();
+
+ ComputeDecompressedAndRGBSizes();
+
+ if(fp)
+ {
+ header->CloseFile();
+ }
}
/**