Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2004/11/25 13:12:02 $
- Version: $Revision: 1.164 $
+ Date: $Date: 2004/12/07 13:39:33 $
+ Version: $Revision: 1.173 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#include "gdcmDebug.h"
#include "gdcmUtil.h"
#include "gdcmBinEntry.h"
+#include "gdcmHeader.h"
+#include "gdcmPixelReadConvert.h"
+#include "gdcmPixelWriteConvert.h"
+#include "gdcmDocEntryArchive.h"
+
#include <fstream>
namespace gdcm
void File::Initialise()
{
WriteMode = WMODE_DECOMPRESSED;
- WriteType = WTYPE_IMPL_VR;
+ WriteType = ImplicitVR;
- PixelConverter = new PixelConvert;
+ PixelReadConverter = new PixelReadConvert;
+ PixelWriteConverter = new PixelWriteConvert;
Archive = new DocEntryArchive( HeaderInternal );
if ( HeaderInternal->IsReadable() )
{
- PixelConverter->GrabInformationsFromHeader( HeaderInternal );
+ PixelReadConverter->GrabInformationsFromHeader( HeaderInternal );
}
-
- Pixel_Data = 0;
- ImageDataSize = 0;
}
/**
*/
File::~File()
{
- if( PixelConverter )
+ if( PixelReadConverter )
+ {
+ delete PixelReadConverter;
+ }
+ if( PixelWriteConverter )
{
- delete PixelConverter;
+ delete PixelWriteConverter;
}
if( Archive )
{
*/
size_t File::GetImageDataSize()
{
- return PixelConverter->GetRGBSize();
+ return PixelReadConverter->GetRGBSize();
}
/**
*/
size_t File::GetImageDataRawSize()
{
- return PixelConverter->GetDecompressedSize();
+ return PixelReadConverter->GetDecompressedSize();
}
/**
return 0;
}
- if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() )
+ if ( HeaderInternal->HasLUT() && PixelReadConverter->BuildRGBImage() )
{
- return PixelConverter->GetRGB();
+ return PixelReadConverter->GetRGB();
}
else
{
// When no LUT or LUT conversion fails, return the decompressed
- return PixelConverter->GetDecompressed();
+ return PixelReadConverter->GetDecompressed();
}
}
return 0;
}
- if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() )
+ if ( HeaderInternal->HasLUT() && PixelReadConverter->BuildRGBImage() )
{
- if ( PixelConverter->GetRGBSize() > maxSize )
+ if ( PixelReadConverter->GetRGBSize() > maxSize )
{
dbg.Verbose(0, "File::GetImageDataIntoVector: pixel data bigger"
"than caller's expected MaxSize");
return 0;
}
memcpy( destination,
- (void*)PixelConverter->GetRGB(),
- PixelConverter->GetRGBSize() );
- return PixelConverter->GetRGBSize();
+ (void*)PixelReadConverter->GetRGB(),
+ PixelReadConverter->GetRGBSize() );
+ return PixelReadConverter->GetRGBSize();
}
// Either no LUT conversion necessary or LUT conversion failed
- if ( PixelConverter->GetDecompressedSize() > maxSize )
+ if ( PixelReadConverter->GetDecompressedSize() > maxSize )
{
dbg.Verbose(0, "File::GetImageDataIntoVector: pixel data bigger"
"than caller's expected MaxSize");
return 0;
}
memcpy( destination,
- (void*)PixelConverter->GetDecompressed(),
- PixelConverter->GetDecompressedSize() );
- return PixelConverter->GetDecompressedSize();
+ (void*)PixelReadConverter->GetDecompressed(),
+ PixelReadConverter->GetDecompressedSize() );
+ return PixelReadConverter->GetDecompressedSize();
}
/**
uint8_t* File::GetDecompressed()
{
- uint8_t* decompressed = PixelConverter->GetDecompressed();
+ uint8_t* decompressed = PixelReadConverter->GetDecompressed();
if ( ! decompressed )
{
// The decompressed image migth not be loaded yet:
std::ifstream* fp = HeaderInternal->OpenFile();
- PixelConverter->ReadAndDecompressPixelData( fp );
+ PixelReadConverter->ReadAndDecompressPixelData( fp );
if(fp)
HeaderInternal->CloseFile();
- decompressed = PixelConverter->GetDecompressed();
+ decompressed = PixelReadConverter->GetDecompressed();
if ( ! decompressed )
{
dbg.Verbose(0, "File::GetDecompressed: read/decompress of "
}
/**
- * \brief Points the internal Pixel_Data pointer to the callers inData
+ * \brief Points the internal pointer to the callers inData
* image representation, BUT WITHOUT COPYING THE DATA.
* 'image' Pixels are presented as C-like 2D arrays : line per line.
* 'volume'Pixels are presented as C-like 3D arrays : plane per plane
*/
bool File::SetImageData(uint8_t* inData, size_t expectedSize)
{
-// FIXME : if already allocated, memory leak !
- Pixel_Data = inData;
- ImageDataSize = expectedSize;
-// FIXME : 7fe0, 0010 IS NOT set ...
+ PixelWriteConverter->SetUserData(inData,expectedSize);
+
return true;
}
dbg.Verbose(2, "Fail to open (write) file:", fileName.c_str());
return false;
}
- fp1.write((char*)Pixel_Data, ImageDataSize);
+
+ if(PixelWriteConverter->GetUserData())
+ fp1.write((char*)PixelWriteConverter->GetUserData(), PixelWriteConverter->GetUserDataSize());
+ else if(PixelReadConverter->GetRGB())
+ fp1.write((char*)PixelReadConverter->GetRGB(), PixelReadConverter->GetRGBSize());
+ else if(PixelReadConverter->GetDecompressed())
+ fp1.write((char*)PixelReadConverter->GetDecompressed(), PixelReadConverter->GetDecompressedSize());
+
fp1.close();
return true;
bool File::Write(std::string const& fileName)
{
- switch(WriteType)
- {
- case WTYPE_IMPL_VR:
- return WriteBase(fileName,ImplicitVR);
- case WTYPE_EXPL_VR:
- return WriteBase(fileName,ExplicitVR);
- case WTYPE_ACR:
- return WriteBase(fileName,ACR);
- }
- return(false);
+ return WriteBase(fileName);
+}
+
+bool File::SetEntryByNumber(std::string const& content,
+ uint16_t group, uint16_t element)
+{
+ HeaderInternal->SetEntryByNumber(content,group,element);
+ return true;
}
/**
- * \brief Access to the underlying \ref PixelConverter RGBA LUT
+ * \brief Access to the underlying \ref PixelReadConverter RGBA LUT
*/
uint8_t* File::GetLutRGBA()
{
- return PixelConverter->GetLutRGBA();
+ return PixelReadConverter->GetLutRGBA();
}
//-----------------------------------------------------------------------------
* @param type file type (ExplicitVR, ImplicitVR, ...)
* @return false if write fails
*/
-bool File::WriteBase (std::string const & fileName, FileType type)
+bool File::WriteBase (std::string const & fileName)
{
- switch(type)
+ switch(WriteType)
{
case ImplicitVR:
SetWriteFileTypeToImplicitVR();
SetWriteFileTypeToExplicitVR();
break;
case ACR:
- SetWriteFileTypeToACR();
- break;
case ACR_LIBIDO:
- SetWriteFileTypeToACRLibido();
- break;
- }
-
- switch(WriteMode)
- {
- case WMODE_NATIVE :
- SetWriteToNative();
- break;
- case WMODE_DECOMPRESSED :
- SetWriteToDecompressed();
- break;
- case WMODE_RGB :
- SetWriteToRGB();
+ SetWriteFileTypeToACR();
break;
+ default:
+ SetWriteFileTypeToExplicitVR();
}
// --------------------------------------------------------------
// just before writting ...
/// \todo the best trick would be *change* the recognition code
/// but pb expected if user deals with, e.g. COMPLEX images
-/* if ( HeaderInternal->GetFileType() == ACR_LIBIDO)
+ if( WriteType == ACR_LIBIDO )
{
SetWriteToLibido();
- }*/
+ }
+ else
+ {
+ SetWriteToNoLibido();
+ }
// ----------------- End of Special Patch ----------------
+
+ switch(WriteMode)
+ {
+ case WMODE_DECOMPRESSED :
+ SetWriteToDecompressed();
+ break;
+ case WMODE_RGB :
+ SetWriteToRGB();
+ break;
+ }
bool check = CheckWriteIntegrity();
if(check)
{
- check = HeaderInternal->Write(fileName,type);
+ check = HeaderInternal->Write(fileName,WriteType);
}
+ RestoreWrite();
+ RestoreWriteFileType();
+
// --------------------------------------------------------------
// Special Patch to allow gdcm to re-write ACR-LibIDO formated images
//
// ...and we restore the Header to be Dicom Compliant again
// just after writting
-/* if ( HeaderInternal->GetFileType() == ACR_LIBIDO )
- {
- RestoreWriteFromLibido();
- }*/
+ RestoreWriteOfLibido();
// ----------------- End of Special Patch ----------------
- RestoreWrite();
- RestoreWriteFileType();
-
return check;
}
*/
bool File::CheckWriteIntegrity()
{
- if(Pixel_Data)
+ if(PixelWriteConverter->GetUserData())
{
int numberBitsAllocated = HeaderInternal->GetBitsAllocated();
if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 )
numberBitsAllocated = 16;
}
- int decSize = HeaderInternal->GetXSize()
+ size_t decSize = HeaderInternal->GetXSize()
* HeaderInternal->GetYSize()
* HeaderInternal->GetZSize()
* ( numberBitsAllocated / 8 )
* HeaderInternal->GetSamplesPerPixel();
- int rgbSize = decSize;
+ size_t rgbSize = decSize;
if( HeaderInternal->HasLUT() )
rgbSize = decSize * 3;
switch(WriteMode)
{
- case WMODE_NATIVE :
- break;
case WMODE_DECOMPRESSED :
- if( decSize!=ImageDataSize )
+ if( decSize!=PixelWriteConverter->GetUserDataSize() )
{
dbg.Verbose(0, "File::CheckWriteIntegrity: Data size is incorrect");
- //std::cerr<<"Dec : "<<decSize<<" | "<<ImageDataSize<<std::endl;
return false;
}
break;
case WMODE_RGB :
- if( rgbSize!=ImageDataSize )
+ if( rgbSize!=PixelWriteConverter->GetUserDataSize() )
{
dbg.Verbose(0, "File::CheckWriteIntegrity: Data size is incorrect");
- //std::cerr<<"RGB : "<<decSize<<" | "<<ImageDataSize<<std::endl;
return false;
}
break;
return true;
}
-void File::SetWriteToNative()
-{
- if(Pixel_Data)
- {
- BinEntry* pixel = CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
- pixel->SetValue(GDCM_BINLOADED);
- pixel->SetBinArea(Pixel_Data,false);
- pixel->SetLength(ImageDataSize);
-
- Archive->Push(pixel);
- }
-}
-
void File::SetWriteToDecompressed()
{
if(HeaderInternal->GetNumberOfScalarComponents()==3 && !HeaderInternal->HasLUT())
if(HeaderInternal->HasLUT())
{
photInt->SetValue("PALETTE COLOR ");
- photInt->SetLength(14);
}
else
{
photInt->SetValue("MONOCHROME1 ");
- photInt->SetLength(12);
}
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetDecompressed(),
+ PixelReadConverter->GetDecompressedSize());
+
BinEntry* pixel = CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
pixel->SetValue(GDCM_BINLOADED);
- if(Pixel_Data)
- {
- pixel->SetBinArea(Pixel_Data,false);
- pixel->SetLength(ImageDataSize);
- }
- else
- {
- pixel->SetBinArea(PixelConverter->GetDecompressed(),false);
- pixel->SetLength(PixelConverter->GetDecompressedSize());
- }
+ pixel->SetBinArea(PixelWriteConverter->GetData(),false);
+ pixel->SetLength(PixelWriteConverter->GetDataSize());
Archive->Push(photInt);
Archive->Push(pixel);
{
if(HeaderInternal->GetNumberOfScalarComponents()==3)
{
- PixelConverter->BuildRGBImage();
+ PixelReadConverter->BuildRGBImage();
ValEntry* spp = CopyValEntry(0x0028,0x0002);
spp->SetValue("3 ");
- spp->SetLength(2);
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);
- if(Pixel_Data)
- {
- pixel->SetBinArea(Pixel_Data,false);
- pixel->SetLength(ImageDataSize);
- }
- else if(PixelConverter->GetRGB())
+ if(PixelReadConverter->GetRGB())
{
- pixel->SetBinArea(PixelConverter->GetRGB(),false);
- pixel->SetLength(PixelConverter->GetRGBSize());
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetRGB(),
+ PixelReadConverter->GetRGBSize());
}
else // Decompressed data
{
- pixel->SetBinArea(PixelConverter->GetDecompressed(),false);
- pixel->SetLength(PixelConverter->GetDecompressedSize());
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetDecompressed(),
+ PixelReadConverter->GetDecompressedSize());
}
+ BinEntry* pixel = CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
+ pixel->SetValue(GDCM_BINLOADED);
+ pixel->SetBinArea(PixelWriteConverter->GetData(),false);
+ pixel->SetLength(PixelWriteConverter->GetDataSize());
+
Archive->Push(spp);
Archive->Push(planConfig);
Archive->Push(photInt);
{
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(0x0002,0x0010);
}
-void File::SetWriteFileTypeToACRLibido()
-{
- SetWriteFileTypeToACR();
-}
-
void File::SetWriteFileTypeToExplicitVR()
{
- std::string ts =
- Util::DicomString( TransferSyntaxStrings[ExplicitVRLittleEndian] );
+ std::string ts = Util::DicomString(
+ Document::GetTransferSyntaxValue(ExplicitVRLittleEndian).c_str() );
ValEntry* tss = CopyValEntry(0x0002,0x0010);
tss->SetValue(ts);
- tss->SetLength(ts.length());
Archive->Push(tss);
}
void File::SetWriteFileTypeToImplicitVR()
{
- std::string ts =
- Util::DicomString( TransferSyntaxStrings[ImplicitVRLittleEndian] );
+ std::string ts = Util::DicomString(
+ Document::GetTransferSyntaxValue(ImplicitVRLittleEndian).c_str() );
ValEntry* tss = CopyValEntry(0x0002,0x0010);
tss->SetValue(ts);
- tss->SetLength(ts.length());
}
void File::RestoreWriteFileType()
Archive->Push(newRow);
Archive->Push(newCol);
}
+
+ ValEntry *libidoCode = CopyValEntry(0x0008,0x0010);
+ libidoCode->SetValue("ACRNEMA_LIBIDO_1.1");
+ Archive->Push(libidoCode);
}
-void File::RestoreWriteFromLibido()
+void File::SetWriteToNoLibido()
+{
+ ValEntry *recCode = dynamic_cast<ValEntry *>(HeaderInternal->GetDocEntryByNumber(0x0008,0x0010));
+ if( recCode )
+ {
+ if( recCode->GetValue() == "ACRNEMA_LIBIDO_1.1" )
+ {
+ ValEntry *libidoCode = CopyValEntry(0x0008,0x0010);
+ libidoCode->SetValue("");
+ Archive->Push(libidoCode);
+ }
+ }
+}
+
+void File::RestoreWriteOfLibido()
{
Archive->Restore(0x0028,0x0010);
Archive->Restore(0x0028,0x0011);
+ Archive->Restore(0x0008,0x0010);
}
ValEntry* File::CopyValEntry(uint16_t group,uint16_t element)
newE = GetHeader()->NewBinEntryByNumber(group,element);
}
-
return(newE);
}
//-----------------------------------------------------------------------------
// Private
-/**
- * \brief Set the pixel datas in the good entry of the Header
- */
-void File::SetPixelData(uint8_t* data)
-{
- GetHeader()->SetEntryByNumber( GDCM_BINLOADED,
- GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel());
-
- // Will be 7fe0, 0010 in standard case
- DocEntry* currentEntry = GetHeader()->GetDocEntryByNumber(GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel());
- if ( currentEntry )
- {
- if ( BinEntry* binEntry = dynamic_cast<BinEntry *>(currentEntry) )
- // Flag is to false because datas are kept in the gdcmPixelConvert
- binEntry->SetBinArea( data, false );
- }
-}
//-----------------------------------------------------------------------------
} // end namespace gdcm