1############################################################################
2#
3#  Program: GDCM (Grassroots DICOM). A DICOM library
4#
5#  Copyright (c) 2006-2011 Mathieu Malaterre
6#  All rights reserved.
7#  See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
8#
9#     This software is distributed WITHOUT ANY WARRANTY; without even
10#     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11#     PURPOSE.  See the above copyright notice for more information.
12#
13############################################################################
14
15"""
16GDCM 1.x would write out MR Image Storage as Secondary Capture Object while still setting Rescale Slope/Intercept
17and saving the Pixel Spacing in (0028,0030)
18"""
19
20import gdcm
21import sys,os
22
23def CheckSecondaryCaptureObjectIsMRImageStorage(r):
24  ds = r.GetFile().GetDataSet()
25  # Check Source Image Sequence
26  if ds.FindDataElement( gdcm.Tag(0x0008,0x2112) ):
27    sis = ds.GetDataElement( gdcm.Tag(0x0008,0x2112) )
28    sqsis = sis.GetSequenceOfItems()
29    if sqsis.GetNumberOfItems():
30      item1 = sqsis.GetItem(1)
31      nestedds = item1.GetNestedDataSet()
32      if nestedds.FindDataElement( gdcm.Tag(0x0008,0x1150) ):
33        ReferencedSOPClassUID = nestedds.GetDataElement( gdcm.Tag(0x0008,0x1150) )
34        raw = ReferencedSOPClassUID.GetByteValue().GetPointer()
35        uids = gdcm.UIDs()
36        # what is the actual object we are looking at ?
37        ms = gdcm.MediaStorage()
38        ms.SetFromDataSet(ds)
39        msuid = ms.GetString()
40        uids.SetFromUID( msuid )
41        msuidname = uids.GetName() # real Media Storage Name
42        uids.SetFromUID( raw )
43        sqmsuidname = uids.GetName() # Source Image Sequence Media Storage Name
44        # If object is SC and Source derivation is MRImageStorage then we can assume 'Pixel Spacing' is correct
45        if( sqmsuidname == 'MR Image Storage' and msuidname == 'Secondary Capture Image Storage' ):
46          return True
47  # in all other case simply return the currentspacing:
48  return False
49
50if __name__ == "__main__":
51  r = gdcm.ImageReader()
52  filename = sys.argv[1]
53  r.SetFileName( filename )
54  if not r.Read():
55    sys.exit(1)
56  f = r.GetFile()
57
58  if( CheckSecondaryCaptureObjectIsMRImageStorage(r) ):
59    # Special handling of the spacing:
60    # GDCM 1.2.0 would not rewrite correcly DICOM Object and would always set them as 'Secondary Capture Image Storage'
61    # while we would rather have 'MR Image Storage'
62    gdcm.ImageHelper.SetForcePixelSpacing( True )
63    mrspacing = gdcm.ImageHelper.GetSpacingValue( r.GetFile() )
64    # TODO: I cannot do simply the following:
65    #image.SetSpacing( mrspacing )
66    image.SetSpacing(0, mrspacing[0] )
67    image.SetSpacing(1, mrspacing[1] )
68    image.SetSpacing(2, mrspacing[2] )
69    gdcm.ImageHelper.SetForceRescaleInterceptSlope( True )
70    ris = gdcm.ImageHelper.GetRescaleInterceptSlopeValue( r.GetFile() )
71    image.SetIntercept( ris[0] )
72    image.SetSlope( ris[1] )
73
74  outfilename = sys.argv[2]
75  w = gdcm.ImageWriter()
76  w.SetFileName( outfilename )
77  w.SetFile( r.GetFile() )
78  w.SetImage( image )
79  if not w.Write():
80    sys.exit(1)
81
82  sys.exit(0)
83