X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmFileHelper.cxx;h=147c289a69684a5a4287f9af67e4d5c38f893e09;hb=de5a59bb6350f6effe5638a24bb2c58e238d9d3f;hp=86405421f43990b80e2253fa00b25c932a14d995;hpb=bc69950a406d06c50f0fb75a96572784965cb534;p=gdcm.git diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index 86405421..147c289a 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -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");