/*========================================================================= 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. =========================================================================*/ /* * This example will show how one can read in two DICOM files, use the dataset * from file1 and use image from file2 to save it in a 3rd file. * * Eg: * MergeTwoFiles gdcmData/012345.002.050.dcm gdcmData/test.acr merge.dcm */ #include "gdcmReader.h" #include "gdcmImageReader.h" #include "gdcmImageWriter.h" #include "gdcmWriter.h" #include "gdcmDataSet.h" #include "gdcmAttribute.h" int main(int argc, char *argv[]) { if( argc < 3 ) { return 1; } const char *file1 = argv[1]; const char *file2 = argv[2]; const char *file3 = argv[3]; // Read file1 gdcm::ImageReader reader1; reader1.SetFileName( file1 ); if( !reader1.Read() ) { return 1; } // Read file2 gdcm::ImageReader reader2; reader2.SetFileName( file2 ); if( !reader2.Read() ) { return 1; } // Ok now let's take the DataSet from file1 and the Image from file2 // Warning: if file2 is -for example- a Secondary Capture Storage, then it has no // Image Orientation (Patient) thus any Image Orientation (Patient) from file1 // will be discarded... // let's be fancy. In case reader2 contains explicit, but reader1 is implicit // we would rather see an implicit output if( reader1.GetFile().GetHeader().GetDataSetTransferSyntax() == gdcm::TransferSyntax::ImplicitVRLittleEndian ) { reader2.GetImage().SetTransferSyntax( gdcm::TransferSyntax::ImplicitVRLittleEndian ); } gdcm::ImageWriter writer; writer.SetFileName( file3 ); writer.SetFile( reader1.GetFile() ); // ImageWriter will always use all of gdcm::Image information an override anything wrong from // reader1.GetFile(), including the Transfer Syntax writer.SetImage( reader2.GetImage() ); gdcm::DataSet &ds = reader1.GetFile().GetDataSet(); // Make sure that SOPInstanceUID are different // Simply removing it is sufficient as gdcm::ImageWriter will generate one by default // if not found. ds.Remove( gdcm::Tag(0x0008,0x0018) ); if( !writer.Write() ) { return 1; } return 0; }