X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeader.cxx;h=2aedf3cda06c7f36dd799bdbc5080e20fb9b40b3;hb=d97e9432393b8515630a11586e0e95df6be9eb43;hp=5eb5b5f2b60d15a6d626aa6d89511993f521bb60;hpb=99ac30f10909a566e9506776d33dfacc300d4502;p=gdcm.git diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 5eb5b5f2..2aedf3cd 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/10 14:35:58 $ - Version: $Revision: 1.216 $ + Date: $Date: 2005/01/05 16:30:50 $ + Version: $Revision: 1.219 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -76,6 +76,30 @@ 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 ); + } + } /** @@ -102,7 +126,7 @@ Header::~Header () * @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::ios::out | std::ios::binary); @@ -261,7 +285,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; } @@ -316,14 +340,26 @@ float Header::GetXSpacing() // if single value is found, xspacing is defaulted to yspacing if ( nbValues == 1 ) { - return yspacing; + xspacing = yspacing; } + + 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.) { - dbg.Verbose(0, "Header::GetYSpacing: gdcmData/CT-MONO2-8-abdo.dcm problem"); + dbg.Verbose(0, "Header::GetXSpacing: gdcmData/CT-MONO2-8-abdo.dcm problem"); // seems to be a bug in the header ... - sscanf( strSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing); + nbValues = sscanf( strSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing); + assert( nbValues == 2 ); } return xspacing; @@ -336,7 +372,7 @@ float Header::GetXSpacing() */ float Header::GetYSpacing() { - float yspacing = 0; + float yspacing = 1.; std::string strSpacing = GetEntryByNumber(0x0028,0x0030); if ( strSpacing == GDCM_UNFOUND ) @@ -348,13 +384,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; + 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() @@ -1293,8 +1332,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() @@ -1343,9 +1382,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 } }; @@ -1366,6 +1405,7 @@ void Header::InitializeDefaultHeader() } } + //----------------------------------------------------------------------------- // Private