X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeader.cxx;h=31263819c3b7ea2cace0232fb4eee99965e04bc1;hb=327dfe7647e3720b0f3125f9b19397cb9afc0ed3;hp=14458f78304d590ae9a6f6280f7ee4378291b18d;hpb=14f1a1da17b4e4e0ae1db8e1df11a920eff19c87;p=gdcm.git diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 14458f78..31263819 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmHeader.cxx,v $ Language: C++ - Date: $Date: 2004/12/16 23:17:27 $ - Version: $Revision: 1.217 $ + Date: $Date: 2005/01/06 20:03:28 $ + Version: $Revision: 1.222 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -34,7 +34,7 @@ namespace gdcm * \brief Constructor * @param filename name of the file whose header we want to analyze */ -Header::Header( std::string const & filename ): +Header::Header( std::string const &filename ): Document( filename ) { // for some ACR-NEMA images GrPixel, NumPixel is *not* 7fe0,0010 @@ -76,6 +76,29 @@ Header::Header( std::string const & filename ): { NumPixel = 0x0010; } + + // Now, we know GrPixel and NumPixel. + // Let's create a VirtualDictEntry to allow a further VR modification + // and force VR to match with BitsAllocated. + + DocEntry *entry = GetDocEntryByNumber(GrPixel, NumPixel); + if ( entry != 0 ) + { + + std::string PixelVR; + // 8 bits allocated is a 'O Bytes' , as well as 24 (old ACR-NEMA RGB) + // more than 8 (i.e 12, 16) is a 'O Words' + if ( GetBitsAllocated() == 8 || GetBitsAllocated() == 24 ) + PixelVR = "OB"; + else + PixelVR = "OW"; + + DictEntry* newEntry = NewVirtualDictEntry( + GrPixel, NumPixel, + PixelVR, "PXL", "Pixel Data"); + + entry->SetDictEntry( newEntry ); + } } /** @@ -98,13 +121,13 @@ Header::~Header () * \brief Performs some consistency checking on various 'File related' * (as opposed to 'DicomDir related') entries * then writes in a file all the (Dicom Elements) included the Pixels - * @param fp file pointer on an already open file + * @param fileName file name to write to * @param filetype Type of the File to be written * (ACR-NEMA, ExplicitVR, ImplicitVR) */ -bool Header::Write(std::string fileName,FileType filetype) +bool Header::Write(std::string fileName, FileType filetype) { - std::ofstream* fp = new std::ofstream(fileName.c_str(), + std::ofstream *fp = new std::ofstream(fileName.c_str(), std::ios::out | std::ios::binary); if (*fp == NULL) { @@ -140,7 +163,7 @@ bool Header::Write(std::string fileName,FileType filetype) // Drop 0028|1101, 0028|1102, 0028|1103 // Drop 0028|1201, 0028|1202, 0028|1203 - DocEntry* e = GetDocEntryByNumber(0x0028,0x01101); + DocEntry *e = GetDocEntryByNumber(0x0028,0x01101); if (e) { RemoveEntryNoDestroy(e); @@ -261,7 +284,7 @@ int Header::GetYSize() } // The Rows (0028,0010) entry was optional for ACR/NEMA. It might - // hence be a signal (1d image). So we default to 1: + // hence be a signal (1D image). So we default to 1: return 1; } @@ -319,20 +342,23 @@ float Header::GetXSpacing() xspacing = yspacing; } - if ( xspacing == 0.0 ) xspacing = 1.0; + if ( xspacing == 0.0 ) + xspacing = 1.0; return xspacing; + } // to avoid troubles with David Clunie's-like images - if ( xspacing == 0. && yspacing == 0.) return 1.; + if ( xspacing == 0. && yspacing == 0.) + return 1.; if ( xspacing == 0.) { dbg.Verbose(0, "Header::GetXSpacing: gdcmData/CT-MONO2-8-abdo.dcm problem"); // seems to be a bug in the header ... nbValues = sscanf( strSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing); - assert( nbValues == 3 ); + assert( nbValues == 2 ); } return xspacing; @@ -357,15 +383,16 @@ float Header::GetYSpacing() // if sscanf cannot read any float value, it won't affect yspacing sscanf( strSpacing.c_str(), "%f", &yspacing); - if ( yspacing == 0.0 ) yspacing = 1.0; + if ( yspacing == 0.0 ) + yspacing = 1.0; return yspacing; } /** * \brief gets the info from 0018,0088 : Space Between Slices - * else from 0018,0050 : Slice Thickness - * else 1.0 + * else from 0018,0050 : Slice Thickness + * else 1.0 * @return Z dimension of a voxel-to be */ float Header::GetZSpacing() @@ -1304,8 +1331,8 @@ void Header::GetImageOrientationPatient( float iop[6] ) /** * \brief Initialize a default DICOM header that should contain all the - * field require by other reader. DICOM standart does not - * explicitely defines thoses fields, heuristic has been choosen. + * field require by other reader. DICOM standard does not + * explicitely defines those fields, heuristic has been choosen. * This is not perfect as we are writting a CT image... */ void Header::InitializeDefaultHeader() @@ -1354,9 +1381,9 @@ void Header::InitializeDefaultHeader() { "MONOCHROME1", 0x0028, 0x0004}, // photochromatic interpretation { "0", 0x0028, 0x0010}, // nbRows { "0", 0x0028, 0x0011}, // nbCols - { "8", 0x0028, 0x0100}, // BitsAllocated 8 or 16 - { "8", 0x0028, 0x0101}, // BitsStored 8 or 12 or 16 - { "7", 0x0028, 0x0102}, // HighBit 7 or 11 or 15 + { "8", 0x0028, 0x0100}, // BitsAllocated 8 or 12 or 16 + { "8", 0x0028, 0x0101}, // BitsStored <= BitsAllocated + { "7", 0x0028, 0x0102}, // HighBit <= BitsAllocated - 1 { "0", 0x0028, 0x0103}, // Pixel Representation 0(unsigned) or 1(signed) { 0, 0, 0 } }; @@ -1377,6 +1404,7 @@ void Header::InitializeDefaultHeader() } } + //----------------------------------------------------------------------------- // Private