Program: gdcm
Module: $RCSfile: gdcmPixelReadConvert.cxx,v $
Language: C++
- Date: $Date: 2005/11/30 11:44:38 $
- Version: $Revision: 1.107 $
+ Date: $Date: 2007/08/29 08:10:14 $
+ Version: $Revision: 1.117 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include <fstream>
#include <stdio.h> //for sscanf
-namespace gdcm
+#if defined(__BORLANDC__)
+ #include <mem.h> // for memset
+#endif
+
+namespace GDCM_NAME_SPACE
{
//bool ReadMPEGFile (std::ifstream *fp, char *inputdata, size_t lenght);
/**
* \brief Gets various usefull informations from the file header
* @param file gdcm::File pointer
+ * @param fileHelper gdcm::FileHelper pointer
*/
-void PixelReadConvert::GrabInformationsFromFile( File *file,
+void PixelReadConvert::GrabInformationsFromFile( File *file,
FileHelper *fileHelper )
{
// Number of Bits Allocated for storing a Pixel is defaulted to 16
BitsAllocated = 16;
}
+ else if (BitsAllocated > 8 && BitsAllocated < 16 && BitsAllocated != 12)
+ {
+ BitsAllocated = 16;
+ }
// Number of "Bits Stored", defaulted to number of "Bits Allocated"
// when absent from the file.
BitsStored = file->GetBitsStored();
XSize = file->GetXSize();
YSize = file->GetYSize();
ZSize = file->GetZSize();
+ TSize = file->GetTSize();
SamplesPerPixel = file->GetSamplesPerPixel();
//PixelSize = file->GetPixelSize(); Useless
PixelSign = file->IsSignedPixelData();
SwapCode = file->GetSwapCode();
-
+
IsPrivateGETransferSyntax = IsMPEG
= IsJPEG2000 = IsJPEGLS = IsJPEGLossy
= IsJPEGLossless = IsRLELossless
= false;
-
+
if (! file->IsDicomV3() ) // Should be ACR-NEMA file
{
IsRaw = true;
std::string ts = file->GetTransferSyntax();
IsRaw = false;
- while (true) // short to write than if elseif elseif elseif ...
+ while (true) // shorter to write than 'if elseif elseif elseif' ...
{
// mind the order : check the most usual first.
if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ExplicitVRLittleEndian) break;
if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRLittleEndian ) break;
if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ExplicitVRBigEndian) break;
if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRBigEndianPrivateGE) break;
- if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::DeflatedExplicitVRLittleEndian) break;
+ // DeflatedExplicitVRLittleEndian syntax means the whole Dataset (Header + Pixels) is compressed !
+ // Not dealt with ! (Parser hangs)
+ //if( IsRaw = Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::DeflatedExplicitVRLittleEndian) break;
break;
}
// cache whether this is a strange GE transfer syntax (which uses
if( IsJPEG2000 = Global::GetTS()->IsJPEG2000(ts) ) break;
if( IsMPEG = Global::GetTS()->IsMPEG(ts) ) break;
if( IsJPEGLS = Global::GetTS()->IsJPEGLS(ts) ) break;
+ // DeflatedExplicitVRLittleEndian is considered as 'Unexpected' (we don't know yet how to process !)
gdcmWarningMacro("Unexpected Transfer Syntax :[" << ts << "]");
break;
}
unsigned int count = 0;
unsigned int frameSize;
unsigned int bitsAllocated = BitsAllocated;
- if(bitsAllocated == 12)
+ //if(bitsAllocated == 12)
+ if(bitsAllocated > 8 && bitsAllocated < 16)
bitsAllocated = 16;
frameSize = XSize*YSize*SamplesPerPixel*bitsAllocated/8;
if ( PixelDataLength != RawSize )
{
gdcmWarningMacro( "Mismatch between PixelReadConvert : "
- << PixelDataLength << " and RawSize : " << RawSize );
+ << PixelDataLength << " and RawSize : " << RawSize );
}
//todo : is it the right patch?
if (remainingLength !=0 )
fp->read( raw, remainingLength);
- //if ( PixelDataLength > RawSize )
- //{
- // fp->read( (char*)Raw, RawSize); // Read all the frames with a single fread
- //}
- //else
- //{
- // fp->read( (char*)Raw, PixelDataLength); // Read all the frames with a single fread
- //}
-
if ( fp->fail() || fp->eof())
{
gdcmWarningMacro( "Reading of Raw pixel data failed." );
else if ( IsRLELossless )
{
if ( ! RLEInfo->DecompressRLEFile
- ( fp, Raw, XSize, YSize, ZSize, BitsAllocated ) )
+ ( fp, Raw, XSize, YSize, ZSize, TSize, BitsAllocated ) )
{
gdcmWarningMacro( "RLE decompressor failed." );
return false;
void PixelReadConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream *fp )
throw ( FormatError )
{
- int nbPixels = XSize * YSize;
+ /// \todo Fix the 3D, 4D pb
+ int nbPixels = XSize * YSize * TSize;
uint16_t *localDecompres = (uint16_t*)Raw;
for( int p = 0; p < nbPixels; p += 2 )
// make sure this is the right JPEG compression
assert( !IsJPEGLS || !IsJPEG2000 );
// Precompute the offset localRaw will be shifted with
- int length = XSize * YSize * SamplesPerPixel;
+ int length = XSize * YSize * ZSize * SamplesPerPixel;
int numberBytes = BitsAllocated / 8;
-
+
JPEGInfo->DecompressFromFile(fp, Raw, BitsStored, numberBytes, length );
return true;
}
* and
* - (0028,1101),(0028,1102),(0028,1102)
* xxx Palette Color Lookup Table Descriptor are found
- * and
+ * and
* - (0028,1201),(0028,1202),(0028,1202)
* xxx Palette Color Lookup Table Data - are found
* \warning does NOT deal with :
void PixelReadConvert::ConvertSwapZone()
{
unsigned int i;
-
+
// If this file is 'ImplicitVR BigEndian PrivateGE Transfer Syntax',
// then the header is in little endian format and the pixel data is in
// big endian format. When reading the header, GDCM has already established
// ftp://medical.nema.org/medical/dicom/final/sup61_ft.pdf
// and be *very* affraid
//
- int l = XSize * YSize;
+
+ /// \todo : find an example to see how 3rd dim and 4th dim work together
+ int l = XSize * YSize * TSize;
int nbFrames = ZSize;
uint8_t *a = copyRaw + 0;
bitsAllocated = 16;
}
- RawSize = XSize * YSize * ZSize
+ RawSize = XSize * YSize * ZSize * TSize
* ( bitsAllocated / 8 )
* SamplesPerPixel;
if ( HasLUT )
else
{
RGBSize = RawSize;
+
}
+ RawSize += RawSize%2;
+ RGBSize += RGBSize%2;
}
/// Allocates room for RGB Pixels