]> Creatis software - gdcm.git/blobdiff - src/gdcmFile.h
* Reorder source code
[gdcm.git] / src / gdcmFile.h
index f87a1a9e548a05420957fc491514d984ed0c3962..b8275b03b548033e869361fb80b6c698bb8f1dc3 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.h,v $
   Language:  C++
-  Date:      $Date: 2004/12/03 14:22:40 $
-  Version:   $Revision: 1.82 $
+  Date:      $Date: 2005/02/02 16:18:48 $
+  Version:   $Revision: 1.102 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 #ifndef GDCMFILE_H
 #define GDCMFILE_H
 
-#include "gdcmCommon.h"
-#include "gdcmHeader.h"
-#include "gdcmPixelReadConvert.h"
-#include "gdcmPixelWriteConvert.h"
-#include "gdcmDocEntryArchive.h"
+#include "gdcmDocument.h"
 
 namespace gdcm 
 {
+class RLEFramesInfo;
+class JPEGFragmentsInfo;
+
 //-----------------------------------------------------------------------------
-/*
- * In addition to Dicom header exploration, this class is designed
- * for accessing the image/volume content. One can also use it to
- * write Dicom/ACR-NEMA/RAW files.
+// Dicom Part 3.3 Compliant
+enum ModalityType {
+   Unknow,
+   AU,       // Voice Audio
+   AS,       // Angioscopy
+   BI,       // Biomagnetic Imaging
+   CF,       // Cinefluorography
+   CP,       // Culposcopy
+   CR,       // Computed Radiography
+   CS,       // Cystoscopy
+   CT,       // Computed Tomography
+   DD,       // Duplex Dopler
+   DF,       // Digital Fluoroscopy
+   DG,       // Diaphanography
+   DM,       // Digital Microscopy
+   DS,       // Digital Substraction Angiography
+   DX,       // Digital Radiography
+   ECG,      // Echocardiography
+   EPS,      // Basic Cardiac EP
+   ES,       // Endoscopy
+   FA,       // Fluorescein Angiography
+   FS,       // Fundoscopy
+   HC,       // Hard Copy
+   HD,       // Hemodynamic
+   LP,       // Laparoscopy
+   LS,       // Laser Surface Scan
+   MA,       // Magnetic Resonance Angiography
+   MR,       // Magnetic Resonance
+   NM,       // Nuclear Medicine
+   OT,       // Other
+   PT,       // Positron Emission Tomography
+   RF,       // Radio Fluoroscopy
+   RG,       // Radiographic Imaging
+   RTDOSE,   // Radiotherapy Dose
+   RTIMAGE,  // Radiotherapy Image
+   RTPLAN,   // Radiotherapy Plan
+   RTSTRUCT, // Radiotherapy Structure Set
+   SM,       // Microscopic Imaging
+   ST,       // Single-photon Emission Computed Tomography
+   TG,       // Thermography
+   US,       // Ultrasound
+   VF,       // Videofluorography
+   XA,       // X-Ray Angiography
+   XC        // Photographic Imaging
+};
+
+//-----------------------------------------------------------------------------
+
+/**
+ * \brief DICOM elements and their corresponding values (and
+ * additionaly the corresponding DICOM dictionary entry) of the header
+ * of a DICOM file.
+ *
+ * The typical usage of instances of class File is to classify a set of
+ * dicom files according to header information e.g. to create a file hierarchy
+ * reflecting the Patient/Study/Serie informations, or extracting a given
+ * SerieId. Accessing the content (image[s] or volume[s]) is beyond the
+ * functionality of this class and belongs to gdmcFile.
+ * \note  The various entries of the explicit value representation (VR) shall
+ *        be managed within a dictionary which is shared by all File
+ *        instances.
+ * \note  The File::Set*Tag* family members cannot be defined as
+ *        protected due to Swig limitations for as Has_a dependency between
+ *        File and FileHelper.
  */
-class GDCM_EXPORT File
+class GDCM_EXPORT File : public Document
 {
 public:
-   enum WriteMode
-   {
-      WMODE_DECOMPRESSED,
-      WMODE_RGB
-   };
-     
-public:
-   File( Header* header );
-   File( std::string const& filename );
-   virtual ~File();
-
-   /// Accessor to \ref Header
-   Header* GetHeader() { return HeaderInternal; }
-
-   size_t GetImageDataSize();
-   size_t GetImageDataRawSize();
-
-   uint8_t* GetImageData();
-   uint8_t* GetImageDataRaw();
-   size_t GetImageDataIntoVector(void* destination, size_t maxSize);
-
-   bool SetImageData (uint8_t* data, size_t expectedSize);
-
-   // Write pixels of ONE image on hard drive
-   // No test is made on processor "endianity"
-   // The user must call his reader correctly
-   bool WriteRawData  (std::string const& fileName);
-   bool WriteDcmImplVR(std::string const& fileName);
-   bool WriteDcmExplVR(std::string const& fileName);
-   bool WriteAcr      (std::string const& fileName);
-   bool Write(std::string const& fileName);
-
-   virtual bool SetEntryByNumber(std::string const& content,
-                                 uint16_t group, uint16_t element)
-   { 
-      HeaderInternal->SetEntryByNumber(content,group,element);
-      return true;
-   }
-   uint8_t* GetLutRGBA();
-
-   // Write mode
-   void SetWriteModeToDecompressed() { SetWriteMode(WMODE_DECOMPRESSED); };
-   void SetWriteModeToRGB()          { SetWriteMode(WMODE_RGB); };
-   void SetWriteMode(WriteMode mode) { WriteMode = mode; };
-   WriteMode GetWriteMode()          { return WriteMode; };
-
-   // Write format
-   void SetWriteTypeToDcmImplVR()     { SetWriteType(ImplicitVR); };
-   void SetWriteTypeToDcmExplVR()     { SetWriteType(ExplicitVR); };
-   void SetWriteTypeToAcr()           { SetWriteType(ACR); };
-   void SetWriteTypeToAcrLibido()     { SetWriteType(ACR_LIBIDO); };
-   void SetWriteType(FileType format) { WriteType = format; };
-   FileType GetWriteType()            { return WriteType; };
+   File();
+   File( std::string const &filename );
+   ~File();
 
-protected:
-   bool WriteBase(std::string const& fileName);
-   bool CheckWriteIntegrity();
+   // Standard values and informations contained in the header
+   bool IsReadable();
 
-   void SetWriteToDecompressed();
-   void SetWriteToRGB();
-   void RestoreWrite();
+   // Some heuristic based accessors, end user intended 
+   int GetImageNumber();
+   ModalityType GetModality();
 
-   void SetWriteFileTypeToACR();
-   void SetWriteFileTypeToExplicitVR();
-   void SetWriteFileTypeToImplicitVR();
-   void RestoreWriteFileType();
+   int GetXSize();
+   int GetYSize();
+   int GetZSize();
 
-   void SetWriteToLibido();
-   void SetWriteToNoLibido();
-   void RestoreWriteOfLibido();
+   float GetXSpacing();
+   float GetYSpacing();
+   float GetZSpacing();
 
-   ValEntry* CopyValEntry(uint16_t group,uint16_t element);
-   BinEntry* CopyBinEntry(uint16_t group,uint16_t element);
+   float GetXOrigin();
+   float GetYOrigin();
+   float GetZOrigin();
 
-private:
-   void Initialise();
+   void GetImageOrientationPatient( float iop[6] );
 
-   uint8_t* GetDecompressed();
-   int ComputeDecompressedPixelDataSizeFromHeader();
+   int GetBitsStored();
+   int GetBitsAllocated();
+   int GetHighBitPosition();
+   int GetSamplesPerPixel();
+   int GetPlanarConfiguration();
+   int GetPixelSize();
+   std::string GetPixelType();
+   bool IsSignedPixelData();
+   bool IsMonochrome();
+   bool IsPaletteColor();
+   bool IsYBRFull();
 
-private:
-// members variables:
+   bool HasLUT();
+   int GetLUTNbits();
+
+   // For rescaling graylevel:
+   float GetRescaleIntercept();
+   float GetRescaleSlope();
+
+   int GetNumberOfScalarComponents();
+   int GetNumberOfScalarComponentsRaw();
+
+   /// Accessor to \ref File::GrPixel
+   uint16_t GetGrPixel()  { return GrPixel; }
+   /// Accessor to \ref File::NumPixel
+   uint16_t GetNumPixel() { return NumPixel; }
 
-   /// Header to use to load the file
-   Header *HeaderInternal;
+   size_t GetPixelOffset();
+   size_t GetPixelAreaLength();
 
-   /// \brief Whether the underlying \ref Header was loaded by
-   ///  the constructor or passed to the constructor. When false
-   ///  the destructor is in charge of deletion.
-   bool SelfHeader;
-   
-   /// Wether already parsed or not
-   bool Parsed;
+   /// returns the RLE info
+   RLEFramesInfo *GetRLEInfo() { return RLEInfo; }
+   /// Returns the JPEG Fragments info
+   JPEGFragmentsInfo *GetJPEGInfo() { return JPEGInfo; }
 
-   /// Utility pixel converter
-   PixelReadConvert* PixelReadConverter;
-   PixelWriteConvert* PixelWriteConverter;
+   /// Replace patient's specific information by 'anonymous'
+   bool AnonymizeFile();
 
-   // Utility header archive
-   DocEntryArchive *Archive;
+   bool Write(std::string fileName, FileType filetype);
 
-   // Write variables
-   WriteMode WriteMode;
-   FileType WriteType;
+protected:
+   /// Initialize DICOM File when none
+   void InitializeDefaultFile();
+   /// Store the RLE frames info obtained during parsing of pixels.
+   RLEFramesInfo *RLEInfo;
+   /// Store the JPEG fragments info obtained during parsing of pixels.
+   JPEGFragmentsInfo *JPEGInfo;
+
+   /// \brief In some cases (e.g. for some ACR-NEMA images) the Entry Element
+   /// Number of the 'Pixel Element' is *not* found at 0x0010. In order to
+   /// make things easier the parser shall store the proper value in
+   /// NumPixel to provide a unique access facility. 
+   uint16_t NumPixel;
+   /// \brief In some cases (e.g. for some ACR-NEMA images) the header entry for
+   /// the group of pixels is *not* found at 0x7fe0. In order to
+   /// make things easier the parser shall store the proper value in
+   /// GrPixel to provide a unique access facility.
+   uint16_t GrPixel;
+
+private:
+   void ComputeRLEInfo();
+   void ComputeJPEGFragmentInfo();
+   bool     ReadTag(uint16_t, uint16_t);
+   uint32_t ReadTagLength(uint16_t, uint16_t);
+   void ReadAndSkipEncapsulatedBasicOffsetTable();
 };
 } // end namespace gdcm