]> Creatis software - gdcm.git/blobdiff - src/gdcmFileHelper.cxx
Doxygenation
[gdcm.git] / src / gdcmFileHelper.cxx
index 86405421f43990b80e2253fa00b25c932a14d995..147c289a69684a5a4287f9af67e4d5c38f893e09 100644 (file)
@@ -4,8 +4,8 @@
   Module:    $RCSfile: gdcmFileHelper.cxx,v $
   Language:  C++
 
-  Date:      $Date: 2005/10/18 08:35:50 $
-  Version:   $Revision: 1.60 $
+  Date:      $Date: 2005/10/21 16:02:01 $
+  Version:   $Revision: 1.68 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -161,20 +161,20 @@ FileHelper::FileHelper(File *header)
 }
 
 #ifndef GDCM_LEGACY_REMOVE
-/**
- * \brief DEPRECATED : use SetFilename() + SetLoadMode() + Load() methods
+/* *
+ * \ brief DEPRECATED : use SetFilename() + SetLoadMode() + Load() methods
  *        Constructor dedicated to deal with the *pixels* area of a ACR/DICOMV3
  *        file (gdcm::File only deals with the ... header)
  *        Opens (in read only and when possible) an existing file and checks
  *        for DICOM compliance. Returns NULL on failure.
  *        It will be up to the user to load the pixels into memory
- * \note  the in-memory representation of all available tags found in
+ * \ note  the in-memory representation of all available tags found in
  *        the DICOM header is post-poned to first header information access.
  *        This avoid a double parsing of public part of the header when
  *        one sets an a posteriori shadow dictionary (efficiency can be
  *        seen as a side effect).   
- * @param filename file to be opened for parsing
- * @deprecated  use SetFilename() + Load() methods
+ * @ param filename file to be opened for parsing
+ * @ deprecated  use SetFilename() + Load() methods
  */
 FileHelper::FileHelper(std::string const &filename )
 {
@@ -415,8 +415,8 @@ uint8_t *FileHelper::GetImageDataRaw ()
 }
 
 #ifndef GDCM_LEGACY_REMOVE
-/**
- * \brief   Useless function, since PixelReadConverter forces us 
+/* *
+ * \ brief   Useless function, since PixelReadConverter forces us 
  *          copy the Pixels anyway.  
  *          Reads the pixels from disk (uncompress if necessary),
  *          Transforms YBR pixels, if any, into RGB pixels
@@ -424,7 +424,7 @@ uint8_t *FileHelper::GetImageDataRaw ()
  *          Transforms single Grey plane + 3 Palettes into a RGB Plane   
  *          Copies at most MaxSize bytes of pixel data to caller allocated
  *          memory space.
- * \warning This function allows people that want to build a volume
+ * \ warning This function allows people that want to build a volume
  *          from an image stack *not to* have, first to get the image pixels, 
  *          and then move them to the volume area.
  *          It's absolutely useless for any VTK user since vtk chooses 
@@ -433,12 +433,12 @@ uint8_t *FileHelper::GetImageDataRaw ()
  *          to load the image line by line, starting from the end.
  *          VTK users have to call GetImageData
  *     
- * @param   destination Address (in caller's memory space) at which the
+ * @ param   destination Address (in caller's memory space) at which the
  *          pixel data should be copied
- * @param   maxSize Maximum number of bytes to be copied. When MaxSize
+ * @ param   maxSize Maximum number of bytes to be copied. When MaxSize
  *          is not sufficient to hold the pixel data the copy is not
  *          executed (i.e. no partial copy).
- * @return  On success, the number of bytes actually copied. Zero on
+ * @ return  On success, the number of bytes actually copied. Zero on
  *          failure e.g. MaxSize is lower than necessary.
  */
 size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize)
@@ -704,10 +704,14 @@ bool FileHelper::Write(std::string const &fileName)
       // (shame on him !)
       // We add Recognition Code (RET)
         if ( ! FileInternal->GetDataEntry(0x0008, 0x0010) )
-            FileInternal->InsertEntryString("", 0x0008, 0x0010);
+            FileInternal->InsertEntryString("ACR-NEMA V1.0 ", 0x0008, 0x0010);
          SetWriteFileTypeToACR();
         // SetWriteFileTypeToImplicitVR(); // ACR IS implicit VR !
          break;
+      case JPEG:
+         SetWriteFileTypeToJPEG();
+         std::cerr << "Writting as JPEG" << std::endl;
+         break;
    }
    CheckMandatoryElements();
 
@@ -741,6 +745,7 @@ bool FileHelper::Write(std::string const &fileName)
    }
 
    bool check = CheckWriteIntegrity(); // verifies length
+   if (WriteType == JPEG ) check = true;
    if (check)
    {
       check = FileInternal->Write(fileName,WriteType);
@@ -1011,6 +1016,17 @@ void FileHelper::SetWriteFileTypeToACR()
 /**
  * \brief Sets in the File the TransferSyntax to 'Explicit VR Little Endian"   
  */ 
+void FileHelper::SetWriteFileTypeToJPEG()
+{
+   std::string ts = Util::DicomString( 
+      Global::GetTS()->GetSpecialTransferSyntax(TS::JPEGBaselineProcess1) );
+
+   DataEntry *tss = CopyDataEntry(0x0002,0x0010);
+   tss->SetString(ts);
+
+   Archive->Push(tss);
+}
+
 void FileHelper::SetWriteFileTypeToExplicitVR()
 {
    std::string ts = Util::DicomString( 
@@ -1121,8 +1137,8 @@ DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
    DocEntry *oldE = FileInternal->GetDocEntry(group, elem);
    DataEntry *newE;
 
-   if ( oldE && vr != GDCM_UNKNOWN ) 
-      if ( oldE->GetVR()!=vr )
+   if ( oldE && vr != GDCM_VRUNKNOWN ) 
+      if ( oldE->GetVR() != vr )
          oldE = NULL;
 
    if ( oldE )
@@ -1166,6 +1182,8 @@ DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
  
 void FileHelper::CheckMandatoryElements()
 {
+   std::string sop =  Util::CreateUniqueUID();
+   
    // just to remember : 'official' 0002 group
    if ( WriteType != ACR && WriteType != ACR_LIBIDO )
    {
@@ -1193,13 +1211,13 @@ void FileHelper::CheckMandatoryElements()
       e_0002_0001->SetLength(2);
       Archive->Push(e_0002_0001);
 
-   // 'Media Stored SOP Class UID' 
-      // [Secondary Capture Image Storage]
-      CopyMandatoryEntry(0x0002,0x0002,"1.2.840.10008.5.1.4.1.1.7");
+   // Potentialy post-processed image --> [Secondary Capture Image Storage]
+   // 'Media Storage SOP Class UID' 
+      CopyMandatoryEntry(0x0002,0x0002,"1.2.840.10008.5.1.4.1.1.7");    
  
-   // 'Media Stored SOP Instance UID'   
-      CopyMandatoryEntry(0x0002,0x0003,Util::CreateUniqueUID());
-
+   // 'Media Storage SOP Instance UID'   
+      CopyMandatoryEntry(0x0002,0x0003,sop);
+      
    // 'Implementation Class UID'
       CopyMandatoryEntry(0x0002,0x0012,Util::CreateUniqueUID());
 
@@ -1292,20 +1310,21 @@ void FileHelper::CheckMandatoryElements()
  
       // 'Image Type' (The written image is no longer an 'ORIGINAL' one)
       CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY");
-   } 
-   else
-   {
-      // There was no 'SOP Class UID'.
-      // the source image was NOT a true Dicom one.
-      // We consider the image is a 'Secondary Capture' one
-      // SOP Class UID
-      // [Secondary Capture Image Storage]
-      SetMandatoryEntry(0x0008,0x0016,"1.2.840.10008.5.1.4.1.1.7");
    }
 
+   // At the end, not to overwrite the original ones,
+   // needed by 'Referenced SOP Instance UID', 'Referenced SOP Class UID'   
+   // 'SOP Instance UID'  
+   CopyMandatoryEntry(0x0008,0x0018,sop);
+   
+   // whether a 'SOP Class UID' already exists or not in the original image
+   // the gdcm written image *is* a [Secondary Capture Image Storage] !
+   // 'SOP Class UID' : [Secondary Capture Image Storage]
+   CopyMandatoryEntry(0x0008,0x0016,"1.2.840.10008.5.1.4.1.1.7"); 
+             
 // ---- The user will never have to take any action on the following ----.
    // new value for 'SOP Instance UID'
-   SetMandatoryEntry(0x0008,0x0018,Util::CreateUniqueUID());
+   //SetMandatoryEntry(0x0008,0x0018,Util::CreateUniqueUID());
 
    // Instance Creation Date
    CopyMandatoryEntry(0x0008,0x0012,Util::GetCurrentDate().c_str());
@@ -1320,14 +1339,6 @@ void FileHelper::CheckMandatoryElements()
 // Entries whose type is 2c are mandatory-inside-a-Sequence
 // Entries whose type is 3 are optional
 
-   // 'Serie Instance UID'
-   // Keep the value if exists
-   // The user is allowed to create his own Series, 
-   // keeping the same 'Serie Instance UID' for various images
-   // The user shouldn't add any image to a 'Manufacturer Serie'
-   // but there is no way no to allowed him to do that 
-   CheckMandatoryEntry(0x0020,0x000e,Util::CreateUniqueUID());
-
    // 'Study Instance UID'
    // Keep the value if exists
    // The user is allowed to create his own Study, 
@@ -1336,6 +1347,14 @@ void FileHelper::CheckMandatoryElements()
    //          adding new series to an already existing Study 
    CheckMandatoryEntry(0x0020,0x000d,Util::CreateUniqueUID());
 
+   // 'Serie Instance UID'
+   // Keep the value if exists
+   // The user is allowed to create his own Series, 
+   // keeping the same 'Serie Instance UID' for various images
+   // The user shouldn't add any image to a 'Manufacturer Serie'
+   // but there is no way no to allowed him to do that 
+   CheckMandatoryEntry(0x0020,0x000e,Util::CreateUniqueUID());
+   
    // Modality : if missing we set it to 'OTher'
    CheckMandatoryEntry(0x0008,0x0060,"OT");