/*========================================================================= 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 "gdcmWriter.h" #include "gdcmFile.h" #include "gdcmOrientation.h" #include "gdcmAttribute.h" // Very simple orientation changer, fix invalid dataset int main(int argc, char* argv[] ) { // assume AXIAL input for now if( argc < 3 ) { std::cerr << argv[0] << " input.dcm output.dcm" << std::endl; return 1; } const char *filename = argv[1]; const char *outfilename = argv[2]; gdcm::Reader reader; reader.SetFileName( filename ); if (! reader.Read() ) { return 1; } const double axial[] = { 1,0,0, 0,1,0 }; (void)axial; const double coronal[] = { 0,0,1, 1,0,0 }; (void)coronal; const double sagittal[] = { 0,1,0, 0,0,1 }; (void)sagittal; gdcm::Attribute<0x0020,0x0032> at1; // IPP (void)at1; gdcm::Attribute<0x0020,0x0037> at2; // IOP (void)at2; gdcm::File & f = reader.GetFile(); gdcm::DataSet & ds = f.GetDataSet(); at1.SetFromDataSet( ds ); #if 0 at2.SetFromDataSet( ds ); const double * iop = at2.GetValues(); if( !std::equal(iop, iop + 6, axial ) ) { gdcm::Orientation::OrientationType type = gdcm::Orientation::GetType ( iop ); std::cerr << "Wrong orientation: " << gdcm::Orientation::GetLabel( type ) << std::endl; return 1; } at2.SetValues( sagittal ); ds.Replace( at2.GetAsDataElement() ); #endif // for sagittal: swap element 0 & 2 const double tmp0 = at1.GetValue(0); const double tmp2 = at1.GetValue(2); (void)tmp2; //at1.SetValue(tmp2, 0); //at1.SetValue(tmp0, 2); at1.SetValue( - tmp0 ); ds.Replace( at1.GetAsDataElement() ); gdcm::Writer writer; writer.SetFile( f ); writer.SetFileName( outfilename ); if ( !writer.Write() ) { return 1; } return 0; }