X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFileHelper.cxx;h=789ca75230fe8055ea35fa5edad7f59790a9182b;hb=c3d9f58d0e2e537cf5359873b188c1fc9c8b9720;hp=4c6595a3eaee3fa1b08a1ba2e8a3f75f303ac35e;hpb=0ad9dae4659b21bfd5c834c1af724eab4dcdf4f6;p=gdcm.git diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index 4c6595a3..789ca752 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2005/01/23 10:12:34 $ - Version: $Revision: 1.3 $ + Date: $Date: 2005/02/09 18:35:30 $ + Version: $Revision: 1.15 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -23,6 +23,8 @@ #include "gdcmDebug.h" #include "gdcmUtil.h" #include "gdcmBinEntry.h" +#include "gdcmValEntry.h" +#include "gdcmContentEntry.h" #include "gdcmFile.h" #include "gdcmPixelReadConvert.h" #include "gdcmPixelWriteConvert.h" @@ -32,8 +34,6 @@ namespace gdcm { -typedef std::pair IterHT; - //------------------------------------------------------------------------- // Constructor / Destructor /** @@ -88,7 +88,7 @@ FileHelper::FileHelper(File *header) * seen as a side effect). * @param filename file to be opened for parsing */ -FileHelper::FileHelper(std::string const & filename ) +FileHelper::FileHelper(std::string const &filename ) { FileInternal = new File( filename ); SelfHeader = true; @@ -123,18 +123,83 @@ FileHelper::~FileHelper() } //----------------------------------------------------------------------------- -// Print -void FileHelper::Print(std::ostream &os, std::string const &) +// Public +/** + * \brief Accesses an existing DocEntry (i.e. a Dicom Element) + * through it's (group, element) and modifies it's content with + * the given value. + * @param content new value (string) to substitute with + * @param group group number of the Dicom Element to modify + * @param elem element number of the Dicom Element to modify + */ +bool FileHelper::SetValEntry(std::string const &content, + uint16_t group, uint16_t elem) +{ + return FileInternal->SetValEntry(content,group,elem); +} + + +/** + * \brief Accesses an existing DocEntry (i.e. a Dicom Element) + * through it's (group, element) and modifies it's content with + * the given value. + * @param content new value (void* -> uint8_t*) to substitute with + * @param lgth new value length + * @param group group number of the Dicom Element to modify + * @param elem element number of the Dicom Element to modify + */ +bool FileHelper::SetBinEntry(uint8_t *content, int lgth, + uint16_t group, uint16_t elem) { - FileInternal->SetPrintLevel(PrintLevel); - FileInternal->Print(os); + return FileInternal->SetBinEntry(content,lgth,group,elem); +} - PixelReadConverter->SetPrintLevel(PrintLevel); - PixelReadConverter->Print(os); +/** + * \brief Modifies the value of a given DocEntry (Dicom entry) + * when it exists. Create it with the given value when unexistant. + * @param content (string) Value to be set + * @param group Group number of the Entry + * @param elem Element number of the Entry + * \return pointer to the modified/created Dicom entry (NULL when creation + * failed). + */ +ValEntry *FileHelper::InsertValEntry(std::string const &content, + uint16_t group, uint16_t elem) +{ + return FileInternal->InsertValEntry(content,group,elem); +} + +/** + * \brief Modifies the value of a given DocEntry (Dicom entry) + * when it exists. Create it with the given value when unexistant. + * A copy of the binArea is made to be kept in the Document. + * @param binArea (binary) value to be set + * @param lgth new value length + * @param group Group number of the Entry + * @param elem Element number of the Entry + * \return pointer to the modified/created Dicom entry (NULL when creation + * failed). + */ +BinEntry *FileHelper::InsertBinEntry(uint8_t *binArea, int lgth, + uint16_t group, uint16_t elem) +{ + return FileInternal->InsertBinEntry(binArea,lgth,group,elem); +} + +/** + * \brief Modifies the value of a given DocEntry (Dicom entry) + * when it exists. Create it with the given value when unexistant. + * A copy of the binArea is made to be kept in the Document. + * @param group Group number of the Entry + * @param elem Element number of the Entry + * \return pointer to the modified/created Dicom entry (NULL when creation + * failed). + */ +SeqEntry *FileHelper::InsertSeqEntry(uint16_t group, uint16_t elem) +{ + return FileInternal->InsertSeqEntry(group,elem); } -//----------------------------------------------------------------------------- -// Public /** * \brief Get the size of the image data * If the image can be RGB (with a lut or by default), the size @@ -171,9 +236,9 @@ size_t FileHelper::GetImageDataRawSize() } /** - * \brief - Allocates necessary memory, + * \brief - Allocates necessary memory, * - Reads the pixels from disk (uncompress if necessary), - * - Transforms YBR pixels, if any, into RGB pixels + * - Transforms YBR pixels, if any, into RGB pixels, * - Transforms 3 planes R, G, B, if any, into a single RGB Plane * - Transforms single Grey plane + 3 Palettes into a RGB Plane * - Copies the pixel data (image[s]/volume[s]) to newly allocated zone. @@ -255,7 +320,7 @@ size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize) { if ( PixelReadConverter->GetRGBSize() > maxSize ) { - gdcmVerboseMacro( "Pixel data bigger than caller's expected MaxSize"); + gdcmWarningMacro( "Pixel data bigger than caller's expected MaxSize"); return 0; } memcpy( destination, @@ -267,7 +332,7 @@ size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize) // Either no LUT conversion necessary or LUT conversion failed if ( PixelReadConverter->GetRawSize() > maxSize ) { - gdcmVerboseMacro( "Pixel data bigger than caller's expected MaxSize"); + gdcmWarningMacro( "Pixel data bigger than caller's expected MaxSize"); return 0; } memcpy( destination, @@ -282,10 +347,12 @@ size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize) * 'image' Pixels are presented as C-like 2D arrays : line per line. * 'volume'Pixels are presented as C-like 3D arrays : plane per plane * \warning Since the pixels are not copied, it is the caller's responsability - * not to deallocate it's data before gdcm uses them (e.g. with - * the Write() method. - * @param inData user supplied pixel area - * @param expectedSize total image size, in Bytes + * not to deallocate its data before gdcm uses them (e.g. with + * the Write() method ) + * @param inData user supplied pixel area (uint8_t* is just for the compiler. + * user is allowed to pass any kind of pixelsn since the size is + * given in bytes) + * @param expectedSize total image size, *in Bytes* * * @return boolean */ @@ -295,17 +362,22 @@ void FileHelper::SetImageData(uint8_t *inData, size_t expectedSize) } /** - * \brief Set the image datas defined by the user - * \warning When writting the file, this datas are get as default datas to write + * \brief Set the image data defined by the user + * \warning When writting the file, this data are get as default data to write + * @param inData user supplied pixel area (uint8_t* is just for the compiler. + * user is allowed to pass any kind of pixelsn since the size is + * given in bytes) + * @param expectedSize total image size, *in Bytes* + */ -void FileHelper::SetUserData(uint8_t *data, size_t expectedSize) +void FileHelper::SetUserData(uint8_t *inData, size_t expectedSize) { - PixelWriteConverter->SetUserData(data,expectedSize); + PixelWriteConverter->SetUserData(inData,expectedSize); } /** - * \brief Get the image datas defined by the user - * \warning When writting the file, this datas are get as default data to write + * \brief Get the image data defined by the user + * \warning When writting the file, this data are get as default data to write */ uint8_t *FileHelper::GetUserData() { @@ -314,7 +386,7 @@ uint8_t *FileHelper::GetUserData() /** * \brief Get the image data size defined by the user - * \warning When writting the file, this datas are get as default data to write + * \warning When writting the file, this data are get as default data to write */ size_t FileHelper::GetUserDataSize() { @@ -322,7 +394,7 @@ size_t FileHelper::GetUserDataSize() } /** - * \brief Get the image datas from the file. + * \brief Get the image data from the file. * If a LUT is found, the data are expanded to be RGB */ uint8_t *FileHelper::GetRGBData() @@ -340,8 +412,8 @@ size_t FileHelper::GetRGBDataSize() } /** - * \brief Get the image datas from the file. - * If a LUT is found, the datas are not expanded ! + * \brief Get the image data from the file. + * If a LUT is found, the data are not expanded ! */ uint8_t *FileHelper::GetRawData() { @@ -357,6 +429,14 @@ size_t FileHelper::GetRawDataSize() return PixelReadConverter->GetRawSize(); } +/** + * \brief Access to the underlying \ref PixelReadConverter RGBA LUT + */ +uint8_t* FileHelper::GetLutRGBA() +{ + return PixelReadConverter->GetLutRGBA(); +} + /** * \brief Writes on disk A SINGLE Dicom file * NO test is performed on processor "Endiannity". @@ -365,13 +445,12 @@ size_t FileHelper::GetRawDataSize() * (any already existing file is over written) * @return false if write fails */ - bool FileHelper::WriteRawData(std::string const &fileName) { std::ofstream fp1(fileName.c_str(), std::ios::out | std::ios::binary ); if (!fp1) { - gdcmVerboseMacro( "Fail to open (write) file:" << fileName.c_str()); + gdcmWarningMacro( "Fail to open (write) file:" << fileName.c_str()); return false; } @@ -522,85 +601,15 @@ bool FileHelper::Write(std::string const &fileName) return check; } -/** - * \brief Accesses an existing DocEntry (i.e. a Dicom Element) - * through it's (group, element) and modifies it's content with - * the given value. - * @param content new value (string) to substitute with - * @param group group number of the Dicom Element to modify - * @param elem element number of the Dicom Element to modify - */ -bool FileHelper::SetEntry(std::string const &content, - uint16_t group, uint16_t elem) -{ - return FileInternal->SetEntry(content,group,elem); -} - - -/** - * \brief Accesses an existing DocEntry (i.e. a Dicom Element) - * through it's (group, element) and modifies it's content with - * the given value. - * @param content new value (void* -> uint8_t*) to substitute with - * @param lgth new value length - * @param group group number of the Dicom Element to modify - * @param elem element number of the Dicom Element to modify - */ -bool FileHelper::SetEntry(uint8_t *content, int lgth, - uint16_t group, uint16_t elem) -{ - return FileInternal->SetEntry(content,lgth,group,elem); -} - -/** - * \brief Modifies the value of a given DocEntry (Dicom entry) - * when it exists. Create it with the given value when unexistant. - * @param content (string) Value to be set - * @param group Group number of the Entry - * @param elem Element number of the Entry - * \return pointer to the modified/created Dicom entry (NULL when creation - * failed). - */ -bool FileHelper::ReplaceOrCreate(std::string const &content, - uint16_t group, uint16_t elem) -{ - return FileInternal->ReplaceOrCreate(content,group,elem) != NULL; -} - -/* - * \brief Modifies the value of a given DocEntry (Dicom entry) - * when it exists. Create it with the given value when unexistant. - * A copy of the binArea is made to be kept in the Document. - * @param binArea (binary) value to be set - * @param group Group number of the Entry - * @param elem Element number of the Entry - * \return pointer to the modified/created Dicom entry (NULL when creation - * failed). - */ -bool FileHelper::ReplaceOrCreate(uint8_t *binArea, int lgth, - uint16_t group, uint16_t elem) -{ - return FileInternal->ReplaceOrCreate(binArea,lgth,group,elem) != NULL; -} - -/** - * \brief Access to the underlying \ref PixelReadConverter RGBA LUT - */ -uint8_t* FileHelper::GetLutRGBA() -{ - return PixelReadConverter->GetLutRGBA(); -} - //----------------------------------------------------------------------------- // Protected - /** * \brief Check the write integrity * * The tests made are : * - verify the size of the image to write with the possible write * when the user set an image data - * @return true if the check successfulls + * @return true if check is successfull */ bool FileHelper::CheckWriteIntegrity() { @@ -626,16 +635,18 @@ bool FileHelper::CheckWriteIntegrity() case WMODE_RAW : if( decSize!=PixelWriteConverter->GetUserDataSize() ) { - gdcmVerboseMacro( "Data size is incorrect (Raw)" << decSize - << " / " << PixelWriteConverter->GetUserDataSize() ); + gdcmWarningMacro( "Data size (Raw) is incorrect. Should be " + << decSize << " / Found :" + << PixelWriteConverter->GetUserDataSize() ); return false; } break; case WMODE_RGB : if( rgbSize!=PixelWriteConverter->GetUserDataSize() ) { - gdcmVerboseMacro( "Data size is incorrect (RGB)" << decSize - << " / " << PixelWriteConverter->GetUserDataSize() ); + gdcmWarningMacro( "Data size (RGB) is incorrect. Should be " + << decSize << " / Found " + << PixelWriteConverter->GetUserDataSize() ); return false; } break; @@ -646,7 +657,7 @@ bool FileHelper::CheckWriteIntegrity() } /** - * \brief + * \brief Update the File to write RAW datas */ void FileHelper::SetWriteToRaw() { @@ -670,8 +681,13 @@ void FileHelper::SetWriteToRaw() PixelWriteConverter->SetReadData(PixelReadConverter->GetRaw(), PixelReadConverter->GetRawSize()); + std::string vr = "OB"; + if( FileInternal->GetBitsAllocated()>8 ) + vr = "OW"; + if( FileInternal->GetBitsAllocated()==24 ) // For RGB ACR files + vr = "OB"; BinEntry *pixel = - CopyBinEntry(GetFile()->GetGrPixel(),GetFile()->GetNumPixel()); + CopyBinEntry(GetFile()->GetGrPixel(),GetFile()->GetNumPixel(),vr); pixel->SetValue(GDCM_BINLOADED); pixel->SetBinArea(PixelWriteConverter->GetData(),false); pixel->SetLength(PixelWriteConverter->GetDataSize()); @@ -682,7 +698,7 @@ void FileHelper::SetWriteToRaw() } /** - * \brief + * \brief Update the File to write RGB datas */ void FileHelper::SetWriteToRGB() { @@ -710,8 +726,13 @@ void FileHelper::SetWriteToRGB() PixelReadConverter->GetRawSize()); } + std::string vr = "OB"; + if( FileInternal->GetBitsAllocated()>8 ) + vr = "OW"; + if( FileInternal->GetBitsAllocated()==24 ) // For RGB ACR files + vr = "OB"; BinEntry *pixel = - CopyBinEntry(GetFile()->GetGrPixel(),GetFile()->GetNumPixel()); + CopyBinEntry(GetFile()->GetGrPixel(),GetFile()->GetNumPixel(),vr); pixel->SetValue(GDCM_BINLOADED); pixel->SetBinArea(PixelWriteConverter->GetData(),false); pixel->SetLength(PixelWriteConverter->GetDataSize()); @@ -755,7 +776,7 @@ void FileHelper::SetWriteToRGB() } /** - * \brief + * \brief Restore the File write mode */ void FileHelper::RestoreWrite() { @@ -779,7 +800,7 @@ void FileHelper::RestoreWrite() } /** - * \brief + * \brief Set in the File the write type to ACR */ void FileHelper::SetWriteFileTypeToACR() { @@ -787,7 +808,7 @@ void FileHelper::SetWriteFileTypeToACR() } /** - * \brief + * \brief Set in the File the write type to Explicit VR */ void FileHelper::SetWriteFileTypeToExplicitVR() { @@ -801,7 +822,7 @@ void FileHelper::SetWriteFileTypeToExplicitVR() } /** - * \brief + * \brief Set in the File the write type to Implicit VR */ void FileHelper::SetWriteFileTypeToImplicitVR() { @@ -816,13 +837,16 @@ void FileHelper::SetWriteFileTypeToImplicitVR() /** - * \brief + * \brief Restore in the File the write type */ void FileHelper::RestoreWriteFileType() { Archive->Restore(0x0002,0x0010); } +/** + * \brief Set the Write not to Libido format + */ void FileHelper::SetWriteToLibido() { ValEntry *oldRow = dynamic_cast @@ -853,7 +877,7 @@ void FileHelper::SetWriteToLibido() } /** - * \brief + * \brief Set the Write not to No Libido format */ void FileHelper::SetWriteToNoLibido() { @@ -871,7 +895,7 @@ void FileHelper::SetWriteToNoLibido() } /** - * \brief + * \brief Restore the Write format */ void FileHelper::RestoreWriteOfLibido() { @@ -880,12 +904,19 @@ void FileHelper::RestoreWriteOfLibido() Archive->Restore(0x0008,0x0010); } +/** + * \brief Copy a ValEntry content + * @param group Group number of the Entry + * @param elem Element number of the Entry + * \return pointer to the modified/created Val Entry (NULL when creation + * failed). + */ ValEntry *FileHelper::CopyValEntry(uint16_t group,uint16_t elem) { DocEntry *oldE = FileInternal->GetDocEntry(group, elem); ValEntry *newE; - if(oldE) + if( oldE ) { newE = new ValEntry(oldE->GetDictEntry()); newE->Copy(oldE); @@ -906,26 +937,30 @@ ValEntry *FileHelper::CopyValEntry(uint16_t group,uint16_t elem) * \return pointer to the modified/created Bin Entry (NULL when creation * failed). */ -BinEntry *FileHelper::CopyBinEntry(uint16_t group,uint16_t elem) +BinEntry *FileHelper::CopyBinEntry(uint16_t group,uint16_t elem,const std::string &vr) { DocEntry *oldE = FileInternal->GetDocEntry(group, elem); BinEntry *newE; - if(oldE) + if( oldE ) + if( oldE->GetVR()!=vr ) + oldE = NULL; + + if( oldE ) { newE = new BinEntry(oldE->GetDictEntry()); newE->Copy(oldE); } else { - newE = GetFile()->NewBinEntry(group,elem); + newE = GetFile()->NewBinEntry(group,elem,vr); } return newE; } //----------------------------------------------------------------------------- -// Protected +// Private /** * \brief Factorization for various forms of constructors. */ @@ -940,7 +975,7 @@ void FileHelper::Initialize() if ( FileInternal->IsReadable() ) { - PixelReadConverter->GrabInformationsFromHeader( FileInternal ); + PixelReadConverter->GrabInformationsFromFile( FileInternal ); } } @@ -961,7 +996,7 @@ uint8_t *FileHelper::GetRaw() raw = PixelReadConverter->GetRaw(); if ( ! raw ) { - gdcmVerboseMacro( "Read/decompress of pixel data apparently went wrong."); + gdcmWarningMacro( "Read/decompress of pixel data apparently went wrong."); return 0; } } @@ -970,8 +1005,15 @@ uint8_t *FileHelper::GetRaw() } //----------------------------------------------------------------------------- -// Private +// Print +void FileHelper::Print(std::ostream &os, std::string const &) +{ + FileInternal->SetPrintLevel(PrintLevel); + FileInternal->Print(os); + + PixelReadConverter->SetPrintLevel(PrintLevel); + PixelReadConverter->Print(os); +} //----------------------------------------------------------------------------- } // end namespace gdcm -