Module: $RCSfile: gdcmFileHelper.cxx,v $
Language: C++
- Date: $Date: 2005/10/24 21:54:28 $
- Version: $Revision: 1.71 $
+ Date: $Date: 2005/10/26 06:08:24 $
+ Version: $Revision: 1.75 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
*/
FileHelper::FileHelper( )
{
- FileInternal = new File( );
- SelfHeader = true;
+ FileInternal = File::New( );
Initialize();
}
FileHelper::FileHelper(File *header)
{
FileInternal = header;
- SelfHeader = false;
+ header->Register();
Initialize();
if ( FileInternal->IsReadable() )
{
}
}
-#ifndef GDCM_LEGACY_REMOVE
-/*
- * 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
- * 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
- */
-FileHelper::FileHelper(std::string const &filename )
-{
- FileInternal = new File( );
- FileInternal->SetFileName( filename );
- FileInternal->Load();
- SelfHeader = true;
- Initialize();
- if ( FileInternal->IsReadable() )
- {
- PixelReadConverter->GrabInformationsFromFile( FileInternal );
- }
-}
-#endif
-
/**
* \brief canonical destructor
* \note If the header (gdcm::File) was created by the FileHelper constructor,
delete Archive;
}
- if ( SelfHeader )
- {
- delete FileInternal;
- }
+ FileInternal->Unregister();
FileInternal = 0;
}
* - Transforms single Grey plane + 3 Palettes into a RGB Plane
* - Copies the pixel data (image[s]/volume[s]) to newly allocated zone.
* @return Pointer to newly allocated pixel data.
+ * (uint8_t is just for prototyping. feel free to cast)
* NULL if alloc fails
*/
uint8_t *FileHelper::GetImageData()
* - Copies the pixel data (image[s]/volume[s]) to newly allocated zone.
* - DOES NOT transform Grey plane + 3 Palettes into a RGB Plane
* @return Pointer to newly allocated pixel data.
+ * (uint8_t is just for prototyping. feel free to cast)
* NULL if alloc fails
*/
uint8_t *FileHelper::GetImageDataRaw ()
* The writing process will restore the entries as they where before
* entering FileHelper::CheckMandatoryElements, so the user will always
* see the entries just as he left them.
+ * \note
+ * - Entries whose type is 1 are mandatory, with a mandatory value
+ * - Entries whose type is 1c are mandatory-inside-a-Sequence,
+ * with a mandatory value
+ * - Entries whose type is 2 are mandatory, with an optional value
+ * - Entries whose type is 2c are mandatory-inside-a-Sequence,
+ * with an optional value
+ * - Entries whose type is 3 are optional
*
* \todo : - warn the user if we had to add some entries :
* even if a mandatory entry is missing, we add it, with a default value
* - write a user callable full checker, to allow post reading
* and/or pre writting image consistency check.
*/
+
+/* -------------------------------------------------------------------------------------
+To be moved to User's guide / WIKI ?
+
+
+-->'Media Storage SOP Class UID' (0x0002,0x0002)
+-->'SOP Class UID' (0x0008,0x0016) are set to
+ [Secondary Capture Image Storage]
+ (Potentialy, the image was modified by user, and post-processed;
+ it's no longer a 'native' image)
+
+--> 'Image Type' (0x0008,0x0008)
+ is forced to "DERIVED\PRIMARY"
+ (The written image is no longer an 'ORIGINAL' one)
+
+--> 'Modality' (0x0008,0x0060)
+ is defaulted to "OT" (other) if missing.
+ (a fully user created image belongs to *no* modality)
+
+--> 'Media Storage SOP Instance UID' (0x0002,0x0003)
+--> 'Implementation Class UID' (0x0002,0x0012)
+ are automatically generated; no user intervention possible
+
+--> 'Serie Instance UID'(0x0020,0x000e)
+--> 'Study Instance UID'(0x0020,0x000d) are kept as is if already exist
+ created if it doesn't.
+ The user is allowed to create his own Series/Studies,
+ keeping the same 'Serie Instance UID' / 'Study Instance UID'
+ for various images
+ Warning :
+ The user shouldn't add any image to a 'Manufacturer Serie'
+ but there is no way no to allowed him to do that
+
+
+--> If 'SOP Class UID' exists in the native image ('true DICOM' image)
+ we create the 'Source Image Sequence' SeqEntry (0x0008, 0x2112)
+
+ --> 'Referenced SOP Class UID' (0x0008, 0x1150)
+ whose value is the original 'SOP Class UID'
+ ---> 'Referenced SOP Instance UID' (0x0008, 0x1155)
+ whose value is the original 'SOP Class UID'
+
+--> Bits Stored, Bits Allocated, Hight Bit Position are checked for consistency
+--> Pixel Spacing (0x0028,0x0030) is defaulted to "1.0\1.0"
+--> Samples Per Pixel (0x0028,0x0002) is defaulted to 1 (grayscale)
+
+--> Instance Creation Date, Instance Creation Time, Study Date, Study Time
+ are force to current Date and Time
+
+--> Conversion Type (0x0008,0x0064)
+ is forced to 'SYN' (Synthetic Image)
+
+--> Study ID, Series Number, Instance Number, Patient Orientation (Type 2)
+ are created, with empty value if there are missing.
+
+--> Manufacturer, Institution Name, Patient's Name, (Type 2)
+ are defaulted with a 'gdcm' value.
+
+--> Patient ID, Patient's Birth Date, Patient's Sex, (Type 2)
+--> Referring Physician's Name (Type 2)
+ are created, with empty value if there are missing.
+
+ -------------------------------------------------------------------------------------*/
void FileHelper::CheckMandatoryElements()
{
false);
e_0002_0001->SetLength(2);
Archive->Push(e_0002_0001);
+ e_0002_0001->Delete();
// Potentialy post-processed image --> [Secondary Capture Image Storage]
// 'Media Storage SOP Class UID'
<< highBitPosition << " to " << nbBitsAllocated-1
<< " for consistency purpose");
}
+
+ // Pixel Spacing : defaulted to 1.0\1.0
+ CheckMandatoryEntry(0x0028,0x0030,"1.0\\1.0");
+
+ // Samples Per Pixel (type 1) : default to grayscale
+ CheckMandatoryEntry(0x0028,0x0002,"1");
+
+
// --- Check UID-related Entries ---
// If 'SOP Class UID' exists ('true DICOM' image)
// Create 'Source Image Sequence' SeqEntry
SeqEntry *sis = SeqEntry::New (
Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x2112) );
- SQItem *sqi = new SQItem(1);
+ SQItem *sqi = SQItem::New(1);
// (we assume 'SOP Instance UID' exists too)
// create 'Referenced SOP Class UID'
DataEntry *e_0008_1150 = DataEntry::New(
Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1150) );
e_0008_1150->SetString( e_0008_0016->GetString());
sqi->AddEntry(e_0008_1150);
+ e_0008_1150->Delete();
// create 'Referenced SOP Instance UID'
DataEntry *e_0008_0018 = FileInternal->GetDataEntry(0x0008, 0x0018);
Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x1155) );
e_0008_1155->SetString( e_0008_0018->GetString());
sqi->AddEntry(e_0008_1155);
+ e_0008_1155->Delete();
+
+ sis->AddSQItem(sqi,1);
+ sqi->Delete();
- sis->AddSQItem(sqi,1);
// temporarily replaces any previous 'Source Image Sequence'
Archive->Push(sis);
sis->Delete();
+ // FIXME : is 'Image Type' *really* depending on the presence of'SOP Class UID'?
+
// 'Image Type' (The written image is no longer an 'ORIGINAL' one)
CopyMandatoryEntry(0x0008,0x0008,"DERIVED\\PRIMARY");
}
// Accession Number
CopyMandatoryEntry(0x0008,0x0050,"");
- // Conversion Type ... FIXME (type 1)
+ // Conversion Type.
+ // Other possible values are :
// See PS 3.3, Page 408
+
+ // DV = Digitized Video
+ // DI = Digital Interface
+ // DF = Digitized Film
+ // WSD = Workstation
+ // SD = Scanned Document
+ // SI = Scanned Image
+ // DRW = Drawing
+ // SYN = Synthetic Image
+
+ // FIXME : Must we Force Value, or Default value ?
+ // Is it Type 1 for any Modality ?
+ // --> Answer seems to be NO :-(
CopyMandatoryEntry(0x0008,0x0064,"SYN");
// ----- Add Mandatory Entries if missing ---
// Referring Physician's Name :'type 2' entry -> must exist, value not mandatory
CheckMandatoryEntry(0x0008,0x0090,"");
-
- // Pixel Spacing : defaulted to 1.0\1.0
- CheckMandatoryEntry(0x0028,0x0030,"1.0\\1.0");
-
- // Samples Per Pixel (type 1) ... FIXME default to grayscale ?
- CheckMandatoryEntry(0x0028,0x0002,"1");
// Remove some inconstencies (probably some more will be added)