DumpGEMSMovieGroup.cxx
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmReader.h"
#include "gdcmImage.h"
#include "gdcmImageWriter.h"
#include "gdcmDataElement.h"
#include "gdcmPrivateTag.h"
#include "gdcmUIDGenerator.h"
#include <iostream>
#include <string>
#include <map>
bool PrintNameValueMapping( gdcm::SequenceOfItems *sqi_values,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
using namespace gdcm;
// prepare names mapping:
typedef VRToType<VR::UL>::Type UL;
std::map< UL, std::string > names;
assert( sqi_names );
assert( sqi_values );
SequenceOfItems::SizeType s = sqi_names->GetNumberOfItems();
PrivateTag tindex(0x7fe1,0x71,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tname (0x7fe1,0x72,"GEMS_Ultrasound_MovieGroup_001");
// First sequence contains all possible names (this is a dict)
for( SequenceOfItems::SizeType i = 1; i <= s; ++i )
{
const Item & item = sqi_names->GetItem( i );
const DataSet & ds = item.GetNestedDataSet();
if( !ds.FindDataElement( tindex )
|| !ds.FindDataElement( tname ) )
{
assert( 0 );
return false;
}
const DataElement & index = ds.GetDataElement( tindex );
const DataElement & name = ds.GetDataElement( tname );
if( index.IsEmpty() || name.IsEmpty() )
{
assert( 0 );
return false;
}
gdcm::Element<VR::UL, VM::VM1> el1;
el1.SetFromDataElement( index );
gdcm::Element<VR::LO, VM::VM1> el2;
el2.SetFromDataElement( name );
// std::cout << el1.GetValue() << " " << el2.GetValue() << std::endl;
names.insert( std::make_pair( el1.GetValue(), el2.GetValue() ) );
}
SequenceOfItems::SizeType s2 = sqi_values->GetNumberOfItems();
assert( s2 <= s );
PrivateTag tindex2(0x7fe1,0x48,"GEMS_Ultrasound_MovieGroup_001");
for( SequenceOfItems::SizeType i = 1; i <= s2; ++i )
{
const Item & item = sqi_values->GetItem( i );
const DataSet & ds = item.GetNestedDataSet();
if( !ds.FindDataElement( tindex2 ) )
{
assert( 0 );
return false;
}
const DataElement & index2 = ds.GetDataElement( tindex2 );
if( index2.IsEmpty() )
{
assert( 0 );
return false;
}
gdcm::Element<VR::FD, VM::VM1_2> el1;
el1.SetFromDataElement( index2 );
UL copy = (UL)el1.GetValue();
#if 1
std::cout << indent;
std::cout << "( " << names[ copy ];
#endif
// (7fe1,1052) FD 1560 # 8,1 ?
// (7fe1,1057) LT [MscSkelSup] # 10,1 ?
//PrivateTag tvalue(0x7fe1,0x52,"GEMS_Ultrasound_MovieGroup_001");
PrivateTag tvalueint(0x7fe1,0x49,"GEMS_Ultrasound_MovieGroup_001"); // UL
PrivateTag tvaluefloat1(0x7fe1,0x51,"GEMS_Ultrasound_MovieGroup_001"); // FL
PrivateTag tvaluefloat(0x7fe1,0x52,"GEMS_Ultrasound_MovieGroup_001"); // FD
PrivateTag tvalueul(0x7fe1,0x53,"GEMS_Ultrasound_MovieGroup_001"); // UL
PrivateTag tvaluesl(0x7fe1,0x54,"GEMS_Ultrasound_MovieGroup_001"); // SL
PrivateTag tvalueob(0x7fe1,0x55,"GEMS_Ultrasound_MovieGroup_001"); // OB
PrivateTag tvaluetext(0x7fe1,0x57,"GEMS_Ultrasound_MovieGroup_001"); // LT
PrivateTag tvaluefd(0x7fe1,0x77,"GEMS_Ultrasound_MovieGroup_001"); // FD / 1-N
PrivateTag tvaluesl3(0x7fe1,0x79,"GEMS_Ultrasound_MovieGroup_001"); // SL / 1-N
PrivateTag tvaluesl2(0x7fe1,0x86,"GEMS_Ultrasound_MovieGroup_001"); // SL ??
PrivateTag tvaluefd1(0x7fe1,0x87,"GEMS_Ultrasound_MovieGroup_001"); // FD / 1-N
PrivateTag tvaluefloat2(0x7fe1,0x88,"GEMS_Ultrasound_MovieGroup_001"); // FD ??
#if 1
std::cout << " ) = ";
#endif
if( ds.FindDataElement( tvalueint ) )
{
const DataElement & value = ds.GetDataElement( tvalueint );
gdcm::Element<VR::UL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluefloat1 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat1 );
gdcm::Element<VR::FL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluefloat ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat );
gdcm::Element<VR::FD,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluesl ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl );
gdcm::Element<VR::SL,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvalueul ) )
{
const DataElement & value = ds.GetDataElement( tvalueul );
gdcm::Element<VR::UL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
assert( el2.GetLength() == 1 );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvalueob ) )
{
const DataElement & value = ds.GetDataElement( tvalueob );
// gdcm::Element<VR::SL,VM::VM1> el2;
// el2.SetFromDataElement( value );
// std::cout << el2.GetValue() << std::endl;
std::cout << value << std::endl;
}
else if( ds.FindDataElement( tvaluetext ) )
{
const DataElement & value = ds.GetDataElement( tvaluetext );
gdcm::Element<VR::LT,VM::VM1> el2;
el2.SetFromDataElement( value );
std::cout << el2.GetValue() << std::endl;
}
else if( ds.FindDataElement( tvaluesl2 ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl2 );
gdcm::Element<VR::SL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 4 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluesl3 ) )
{
const DataElement & value = ds.GetDataElement( tvaluesl3 );
gdcm::Element<VR::SL,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
// assert( el2.GetLength() == 4 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefd ) )
{
const DataElement & value = ds.GetDataElement( tvaluefd );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
// assert( el2.GetLength() == 4 || el2.GetLength() == 3 || el2.GetLength() == 8 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefloat2 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefloat2 );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 2 );
std::cout << std::endl;
}
else if( ds.FindDataElement( tvaluefd1 ) )
{
const DataElement & value = ds.GetDataElement( tvaluefd1 );
gdcm::Element<VR::FD,VM::VM1_n> el2;
el2.SetFromDataElement( value );
el2.Print( std::cout );
assert( el2.GetLength() == 4 );
std::cout << std::endl;
}
else
{
std::cout << "(no value)" << std::endl;
// std::cout << ds << std::endl;
assert( ds.Size() == 2 );
}
}
return true;
}
bool PrintNameValueMapping2( gdcm::PrivateTag const & privtag, const gdcm::DataSet & ds ,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
if( !ds.FindDataElement( privtag ) ) return false;
const gdcm::DataElement& seq_values = ds.GetDataElement( privtag );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi = seq_values.GetValueAsSQ();
return PrintNameValueMapping( sqi, sqi_names, indent);
}
bool PrintNameValueMapping3( gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2, const gdcm::DataSet & ds ,
gdcm::SequenceOfItems *sqi_names, std::string const & indent )
{
if( !ds.FindDataElement( privtag1 ) )
{
assert( 0 );
return false;
}
const gdcm::DataElement& values10name = ds.GetDataElement( privtag1 );
gdcm::Element<gdcm::VR::LO,gdcm::VM::VM1> el;
el.SetFromDataElement( values10name );
std::cout << std::endl;
std::cout << " <" << el.GetValue().c_str() << ">" << std::endl;
return PrintNameValueMapping2( privtag2, ds, sqi_names, indent);
}
bool print73( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
const gdcm::PrivateTag tseq_values73(0x7fe1,0x73,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values73 ) )
{
std::cout << indent << "No group 73" << std::endl;
return false;
}
const gdcm::DataElement& seq_values73 = ds10.GetDataElement( tseq_values73 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values73 = seq_values73.GetValueAsSQ();
size_t ni3 = sqi_values73->GetNumberOfItems();
for( size_t i3 = 1; i3 <= ni3; ++i3 )
{
gdcm::Item &item_73 = sqi_values73->GetItem(i3);
gdcm::DataSet &ds73 = item_73.GetNestedDataSet();
assert( ds73.Size() == 3 );
const gdcm::PrivateTag tseq_values74name(0x7fe1,0x74,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values75(0x7fe1,0x75,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values74name, tseq_values75, ds73, sqi_dict, indent);
std::cout << std::endl;
}
return true;
}
bool print36( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
(void)sqi_dict;
const gdcm::PrivateTag tseq_values36(0x7fe1,0x36,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values36 ) )
{
std::cout << indent << "No group 36" << std::endl;
return false;
}
const gdcm::DataElement& seq_values36 = ds10.GetDataElement( tseq_values36 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values36 = seq_values36.GetValueAsSQ();
size_t ni3 = sqi_values36->GetNumberOfItems();
assert( ni3 >= 1 );
for( size_t i3 = 1; i3 <= ni3; ++i3 )
{
gdcm::Item &item_36 = sqi_values36->GetItem(i3);
gdcm::DataSet &ds36 = item_36.GetNestedDataSet();
assert( ds36.Size() == 4 );
// (7fe1,1037) UL 47 # 4,1 US MovieGroup Number of Frames
// (7fe1,1043) OB 40\00\1c\c4\67\2f\0b\11\40 # 376,1 ?
// (7fe1,1060) OB 4e\4e\49\4f\4e\47\46\43\2a # 4562714,1 US MovieGroup Image Data
//
const gdcm::PrivateTag timagedata(0x7fe1,0x60,"GEMS_Ultrasound_MovieGroup_001");
assert( ds36.FindDataElement( timagedata ) );
gdcm::DataElement const & imagedata = ds36.GetDataElement( timagedata );
const gdcm::ByteValue * bv = imagedata.GetByteValue();
assert( bv );
static int c = 0;
std::stringstream ss;
ss << "/tmp/debug";
ss << c++;
std::ofstream os( ss.str().c_str(), std::ios::binary );
os.write( bv->GetPointer(), bv->GetLength() );
os.close();
//const gdcm::PrivateTag tseq_values85(0x7fe1,0x85,"GEMS_Ultrasound_MovieGroup_001");
//PrintNameValueMapping3( tseq_values84name, tseq_values85, ds83, sqi_dict, indent);
//std::cout << std::endl;
}
return true;
}
bool print83( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
const gdcm::PrivateTag tseq_values83(0x7fe1,0x83,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values83 ) )
{
std::cout << indent << "No group 83" << std::endl;
return false;
}
const gdcm::DataElement& seq_values83 = ds10.GetDataElement( tseq_values83 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values83 = seq_values83.GetValueAsSQ();
size_t ni3 = sqi_values83->GetNumberOfItems();
for( size_t i3 = 1; i3 <= ni3; ++i3 )
{
gdcm::Item &item_83 = sqi_values83->GetItem(i3);
gdcm::DataSet &ds83 = item_83.GetNestedDataSet();
assert( ds83.Size() == 3 );
const gdcm::PrivateTag tseq_values84name(0x7fe1,0x84,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values85(0x7fe1,0x85,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values84name, tseq_values85, ds83, sqi_dict, indent);
std::cout << std::endl;
}
return true;
}
bool PrintNameValueMapping4( gdcm::PrivateTag const & privtag0, const gdcm::DataSet & subds, gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2,
gdcm::SequenceOfItems *sqi_dict, std::string const & indent )
{
(void)indent;
if( !subds.FindDataElement( privtag0 ) )
{
assert( 0 );
return false;
}
const gdcm::DataElement& seq_values10 = subds.GetDataElement( privtag0 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values10 = seq_values10.GetValueAsSQ();
size_t ni1 = sqi_values10->GetNumberOfItems();
// assert( ni1 == 1 );
for( size_t i1 = 1; i1 <= ni1; ++i1 )
{
gdcm::Item &item_10 = sqi_values10->GetItem(i1);
gdcm::DataSet &ds10 = item_10.GetNestedDataSet();
assert( ds10.Size() == 2 + 3 );
// (7fe1,0010)
// (7fe1,1012)
// (7fe1,1018)
// (7fe1,1020)
// (7fe1,1083)
PrintNameValueMapping3( privtag1, privtag2, ds10, sqi_dict, " " );
std::cout << std::endl;
const gdcm::PrivateTag tseq_values20(0x7fe1,0x20,"GEMS_Ultrasound_MovieGroup_001");
if( !ds10.FindDataElement( tseq_values20 ) )
{
assert( 0 );
return false;
}
const gdcm::DataElement& seq_values20 = ds10.GetDataElement( tseq_values20 );
gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values20 = seq_values20.GetValueAsSQ();
size_t ni2 = sqi_values20->GetNumberOfItems();
//assert( ni == 1 );
for( size_t i2 = 1; i2 <= ni2; ++i2 )
{
gdcm::Item &item_20 = sqi_values20->GetItem(i2);
gdcm::DataSet &ds20 = item_20.GetNestedDataSet();
size_t count = ds20.Size(); (void)count;
assert( ds20.Size() == 2 + 3 || ds20.Size() == 2 + 2 );
// (7fe1,0010)
// (7fe1,1024)
// (7fe1,1026)
// (7fe1,1036)
// (7fe1,103a)
// (7fe1,1083) (*)
const gdcm::PrivateTag tseq_values20name(0x7fe1,0x24,"GEMS_Ultrasound_MovieGroup_001");
const gdcm::PrivateTag tseq_values26(0x7fe1,0x26,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping3( tseq_values20name, tseq_values26, ds20, sqi_dict, " ");
std::cout << std::endl;
print36(ds20, sqi_dict, " ");
print83(ds20, sqi_dict, " ");
}
print83(ds10, sqi_dict, " ");
}
return true;
}
int main(int argc, char *argv[])
{
if( argc < 2 ) return 1;
using namespace gdcm;
const char *filename = argv[1];
gdcm::Reader reader;
reader.SetFileName( filename );
if( !reader.Read() ) return 1;
gdcm::File &file = reader.GetFile();
gdcm::DataSet &ds = file.GetDataSet();
const PrivateTag tseq(0x7fe1,0x1,"GEMS_Ultrasound_MovieGroup_001");
if( !ds.FindDataElement( tseq ) ) return 1;
const DataElement& seq = ds.GetDataElement( tseq );
SmartPointer<SequenceOfItems> sqi = seq.GetValueAsSQ();
assert( sqi->GetNumberOfItems() == 1 );
Item &item = sqi->GetItem(1);
DataSet &subds = item.GetNestedDataSet();
const PrivateTag tseq_dict(0x7fe1,0x70,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_dict ) ) return 1;
const DataElement& seq_dict = subds.GetDataElement( tseq_dict );
SmartPointer<SequenceOfItems> sqi_dict = seq_dict.GetValueAsSQ();
const PrivateTag tseq_values8(0x7fe1,0x8,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_values8 ) ) return 1;
const DataElement& seq_values8 = subds.GetDataElement( tseq_values8 );
SmartPointer<SequenceOfItems> sqi_values8 = seq_values8.GetValueAsSQ();
const PrivateTag tseq_values8name(0x7fe1,0x2,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq_values8name ) ) return 1;
const DataElement& values8name = subds.GetDataElement( tseq_values8name );
{
Element<VR::LO,VM::VM1> el;
el.SetFromDataElement( values8name );
std::cout << el.GetValue() << std::endl;
}
size_t count = subds.Size(); (void)count;
assert( subds.Size() == 3 + 2 + 1 || subds.Size() == 3 + 2 + 2);
// (7fe1,0010) # 30,1 Private Creator
// (7fe1,1002) # 8,1 US MovieGroup Value 0008 Name
// (7fe1,1003) # 4,1 ?
// (7fe1,1008) # 8140,1 US MovieGroup Value 0008 Sequence
// (7fe1,1010) # 1372196,1 ?
// (7fe1,1070) # 33684,1 US MovieGroup Dict
// (7fe1,1073) (*)
PrintNameValueMapping( sqi_values8, sqi_dict, " ");
const PrivateTag tseq_values10(0x7fe1,0x10,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq_values10name(0x7fe1,0x12,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq_values18(0x7fe1,0x18,"GEMS_Ultrasound_MovieGroup_001");
PrintNameValueMapping4( tseq_values10, subds, tseq_values10name, tseq_values18, sqi_dict," ");
print73( subds, sqi_dict, " " );
#if 0
gdcm::DataSet::ConstIterator it = subds.Begin();
for( ; it != subds.End(); ++it )
{
const gdcm::DataElement &de = *it;
std::cout << de.GetTag() << std::endl;
}
#endif
return 0;
}
gdcm::ByteValue
Class to represent binary value (array of bytes).
Definition gdcmByteValue.h:35
gdcm::ByteValue::GetPointer
const char * GetPointer() const
Definition gdcmByteValue.h:110
gdcm::ByteValue::GetLength
VL GetLength() const override
Definition gdcmByteValue.h:77
gdcm::DataElement
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
gdcm::DataElement::GetTag
const Tag & GetTag() const
Get Tag.
Definition gdcmDataElement.h:67
gdcm::DataElement::GetByteValue
const ByteValue * GetByteValue() const
Definition gdcmDataElement.h:133
gdcm::DataElement::IsEmpty
bool IsEmpty() const
Check if Data Element is empty.
Definition gdcmDataElement.h:106
gdcm::DataElement::GetValueAsSQ
SmartPointer< SequenceOfItems > GetValueAsSQ() const
gdcm::DataSet
Class to represent a Data Set (which contains Data Elements).
Definition gdcmDataSet.h:56
gdcm::DataSet::GetDataElement
const DataElement & GetDataElement(const Tag &t) const
Definition gdcmDataSet.h:188
gdcm::DataSet::FindDataElement
bool FindDataElement(const PrivateTag &t) const
Look up if private tag 't' is present in the dataset:
gdcm::DataSet::ConstIterator
DataElementSet::const_iterator ConstIterator
Definition gdcmDataSet.h:60
gdcm::DataSet::Begin
ConstIterator Begin() const
Definition gdcmDataSet.h:64
gdcm::DataSet::Size
SizeType Size() const
Definition gdcmDataSet.h:75
gdcm::DataSet::End
ConstIterator End() const
Definition gdcmDataSet.h:66
gdcm::Element
Element class.
Definition gdcmElement.h:70
gdcm::Element::GetLength
unsigned long GetLength() const
Definition gdcmElement.h:79
gdcm::Element::GetValue
const VRToType< TVR >::Type & GetValue(unsigned int idx=0) const
Definition gdcmElement.h:94
gdcm::Element::Print
void Print(std::ostream &_os) const
Definition gdcmElement.h:85
gdcm::Element::SetFromDataElement
void SetFromDataElement(DataElement const &de)
Definition gdcmElement.h:110
gdcm::File
a DICOM File
Definition gdcmFile.h:34
gdcm::File::GetDataSet
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
gdcm::Item
Class to represent an Item.
Definition gdcmItem.h:46
gdcm::Item::GetNestedDataSet
const DataSet & GetNestedDataSet() const
Definition gdcmItem.h:80
gdcm::PrivateTag
Class to represent a Private DICOM Data Element (Attribute) Tag (Group, Element, Owner).
Definition gdcmPrivateTag.h:39
gdcm::Reader
Reader ala DOM (Document Object Model).
Definition gdcmReader.h:54
gdcm::Reader::GetFile
const File & GetFile() const
Set/Get File.
Definition gdcmReader.h:72
gdcm::Reader::Read
virtual bool Read()
Main function to read a file.
gdcm::Reader::SetFileName
void SetFileName(const char *filename_native)
gdcm::SequenceOfItems
Class to represent a Sequence Of Items.
Definition gdcmSequenceOfItems.h:40
gdcm::SequenceOfItems::GetNumberOfItems
SizeType GetNumberOfItems() const
Definition gdcmSequenceOfItems.h:86
gdcm::SequenceOfItems::GetItem
const Item & GetItem(SizeType position) const
gdcm::SequenceOfItems::SizeType
ItemVector::size_type SizeType
Definition gdcmSequenceOfItems.h:44
gdcm::SmartPointer
Class for Smart Pointer.
Definition gdcmSmartPointer.h:40
gdcmDataElement.h
gdcmImageWriter.h
gdcmImage.h
gdcmPrivateTag.h
gdcmReader.h
gdcmUIDGenerator.h
gdcm
Definition gdcmASN1.h:21
gdcm::VRToType
Definition gdcmVR.h:244