X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmFileHelper.h;h=34b0c7a3c2bd7faed535ff276bb138f68cdb0226;hb=24394a63b18810c791af1c913e1a6fc712d3d3a0;hp=ee5e9d776ac572051ea069079970f0943885a398;hpb=1e670813be403bc4ecd88fb78405d0a8969fca6c;p=gdcm.git diff --git a/src/gdcmFileHelper.h b/src/gdcmFileHelper.h index ee5e9d77..34b0c7a3 100644 --- a/src/gdcmFileHelper.h +++ b/src/gdcmFileHelper.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFileHelper.h,v $ Language: C++ - Date: $Date: 2005/09/02 07:10:03 $ - Version: $Revision: 1.22 $ + Date: $Date: 2006/07/06 12:38:06 $ + Version: $Revision: 1.46 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -20,16 +20,14 @@ #define GDCMFILEHELPER_H #include "gdcmDebug.h" -#include "gdcmBase.h" -//#include - - +#include "gdcmRefCounter.h" +#include "gdcmVRKey.h" +#include "gdcmFile.h" namespace gdcm { -class File; -class ValEntry; -class BinEntry; +//class File; +class DataEntry; class SeqEntry; class PixelReadConvert; class PixelWriteConvert; @@ -43,22 +41,22 @@ typedef void (*VOID_FUNCTION_PUINT8_PFILE_POINTER)(uint8_t *, File *); * for accessing the image/volume content. One can also use it to * write Dicom/ACR-NEMA/RAW files. */ -class GDCM_EXPORT FileHelper : public Base +class GDCM_EXPORT FileHelper : public RefCounter { + gdcmTypeMacro(FileHelper); + public: enum FileMode { WMODE_RAW, WMODE_RGB }; - -public: - FileHelper( ); - FileHelper( File *header ); - GDCM_LEGACY(FileHelper( std::string const &filename )); - - virtual ~FileHelper(); +/// \brief Constructs a FileHelper with a RefCounter + static FileHelper *New() {return new FileHelper();} +/// \brief Constructs a FileHelper with a RefCounter from a fileHelper + static FileHelper *New(File *header) {return new FileHelper(header);} + void Print(std::ostream &os = std::cout, std::string const &indent = ""); /// Accessor to \ref File @@ -68,19 +66,19 @@ public: void SetLoadMode(int loadMode); void SetFileName(std::string const &fileName); bool Load(); - /// to allow user to modify pixel order (e.g. Mirror, TopDown,...) + /// to allow user to modify pixel order (e.g. Mirror, UpsideDown,...) void SetUserFunction( VOID_FUNCTION_PUINT8_PFILE_POINTER userFunc ) { UserFunction = userFunc; } // File methods - bool SetValEntry(std::string const &content, - uint16_t group, uint16_t elem); - bool SetBinEntry(uint8_t *content, int lgth, - uint16_t group, uint16_t elem); - - ValEntry *InsertValEntry(std::string const &content, - uint16_t group, uint16_t elem); - BinEntry *InsertBinEntry(uint8_t *binArea, int lgth, + bool SetEntryString(std::string const &content, + uint16_t group, uint16_t elem); + bool SetEntryBinArea(uint8_t *content, int lgth, uint16_t group, uint16_t elem); + + DataEntry *InsertEntryString(std::string const &content, + uint16_t group, uint16_t elem, const VRKey &vr); + DataEntry *InsertEntryBinArea(uint8_t *binArea, int lgth, + uint16_t group, uint16_t elem, const VRKey &vr); SeqEntry *InsertSeqEntry(uint16_t group, uint16_t elem); // File helpers @@ -90,7 +88,7 @@ public: uint8_t *GetImageData(); uint8_t *GetImageDataRaw(); - GDCM_LEGACY(size_t GetImageDataIntoVector(void *destination,size_t maxSize)); +// GDCM_LEGACY(size_t GetImageDataIntoVector(void *destination,size_t maxSize)) void SetImageData(uint8_t *data, size_t expectedSize); @@ -119,7 +117,11 @@ public: /// (as opposed to 'Grey pixels + Palettes color') void SetWriteModeToRGB() { SetWriteMode(WMODE_RGB); } /// \brief Sets the Write Mode ( ) - void SetWriteMode(FileMode mode) { WriteMode = mode; } + void SetWriteMode(FileMode mode) { + WriteMode = mode; + // Deal with Samples per Pixel + //if (mode == WMODE_RGB) FileInternal->InsertEntryString("3",0x0028,0x0002); + } /// \brief Gets the Write Mode ( ) FileMode GetWriteMode() { return WriteMode; } @@ -133,11 +135,15 @@ public: void SetWriteTypeToAcr() { SetWriteType(ACR); } /// \brief Tells the writer we want to write as LibIDO void SetWriteTypeToAcrLibido() { SetWriteType(ACR_LIBIDO); } + /// \brief Tells the writer we want to write as JPEG + void SetWriteTypeToJPEG() { SetWriteType(JPEG); } + /// \brief Tells the writer we want to write as JPEG2000 + void SetWriteTypeToJPEG2000() { SetWriteType(JPEG2000); } /// \brief Tells the writer which format we want to write /// (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) void SetWriteType(FileType format) { WriteType = format; } /// \brief Gets the format we talled the write we wanted to write - /// (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) + /// (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) FileType GetWriteType() { return WriteType; } // Write pixels of ONE image on hard drive @@ -148,8 +154,29 @@ public: bool WriteDcmExplVR(std::string const &fileName); bool WriteAcr (std::string const &fileName); bool Write (std::string const &fileName); - + +/// \brief We have to deal with 4 *very* different cases : +/// -1) user created ex nihilo his own image and wants to write it as a Dicom image. +/// USER_OWN_IMAGE +/// -2) user modified the pixels of an existing image. +/// FILTERED_IMAGE +/// -3) user created a new image, using existing images (eg MIP, MPR, cartography image) +/// CREATED_IMAGE +/// -4) user modified/added some tags *without processing* the pixels (anonymization... +/// UNMODIFIED_PIXELS_IMAGE + + void SetContentType (ImageContentType c) { ContentType = c; } + // no GetContentType() method, on purpose! + + void CallStartMethod(); + void CallProgressMethod(); + void CallEndMethod(); + protected: + FileHelper( ); + FileHelper( File *header ); + ~FileHelper(); + bool CheckWriteIntegrity(); void SetWriteToRaw(); @@ -157,6 +184,8 @@ protected: void RestoreWrite(); void SetWriteFileTypeToACR(); + void SetWriteFileTypeToJPEG(); + void SetWriteFileTypeToJPEG2000(); void SetWriteFileTypeToExplicitVR(); void SetWriteFileTypeToImplicitVR(); void RestoreWriteFileType(); @@ -165,10 +194,15 @@ protected: void SetWriteToNoLibido(); void RestoreWriteOfLibido(); - ValEntry *CopyValEntry(uint16_t group, uint16_t elem); - BinEntry *CopyBinEntry(uint16_t group, uint16_t elem, - const std::string &vr); + DataEntry *CopyDataEntry(uint16_t group, uint16_t elem, + const VRKey &vr = GDCM_VRUNKNOWN); void CheckMandatoryElements(); + void CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value, + const VRKey &vr = GDCM_VRUNKNOWN); + void SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value, + const VRKey &vr = GDCM_VRUNKNOWN); + void CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value, + const VRKey &vr = GDCM_VRUNKNOWN); void RestoreWriteMandatory(); private: @@ -177,14 +211,16 @@ private: uint8_t *GetRaw(); // members variables: +protected: + /// value of the ??? for any progress bar + float Progress; + mutable bool Abort; + +private: + /// gdcm::File to use to load the file File *FileInternal; - /// \brief Whether the underlying \ref gdcm::File was loaded by - /// the constructor or passed to the constructor. - /// When false the destructor is in charge of deletion. - bool SelfHeader; - /// Whether already parsed or not bool Parsed; @@ -201,15 +237,25 @@ private: // Write variables /// \brief (WMODE_RAW, WMODE_RGB) FileMode WriteMode; + /// \brief (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) FileType WriteType; - /// Pointer to a user supplied function to allow modification of pixel order - /// (i.e. : Mirror, TopDown, 90°Rotation, ...) + + /// \brief Pointer to a user supplied function to allow modification + /// of pixel order (e.g. : Mirror, UpsideDown, 90°Rotation, ...) /// use as : void userSuppliedFunction(uint8_t *im, gdcm::File *f) /// NB : the "uint8_t *" type of first param is just for prototyping. /// User will Cast it according what he founds with f->GetPixelType() /// See vtkgdcmSerieViewer for an example VOID_FUNCTION_PUINT8_PFILE_POINTER UserFunction; + + /// \brief only user knows what he did before asking the image to be written + /// - he created ex nihilo his own image + /// - he just applied a mathematical process on the pixels + /// - he created a new image, using existing images (eg MIP, MPR,cartography) + /// - he anonymized and image (*no* modif on the pixels) + ImageContentType ContentType; + }; } // end namespace gdcm