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 #include "gdcmImage.h"
15 #include "gdcmTrace.h"
16 #include "gdcmExplicitDataElement.h"
17 #include "gdcmByteValue.h"
18 #include "gdcmDataSet.h"
19 #include "gdcmSequenceOfFragments.h"
20 #include "gdcmFragment.h"
21
22 #include <iostream>
23 #include <limits>
24
25 namespace gdcm
26 {
27
GetSpacing() const28 const double *Image::GetSpacing() const
29 {
30 assert( NumberOfDimensions );
31 return &Spacing[0];
32 }
33
GetSpacing(unsigned int idx) const34 double Image::GetSpacing(unsigned int idx) const
35 {
36 assert( NumberOfDimensions );
37 //if( idx < Spacing.size() )
38 {
39 return Spacing[idx];
40 }
41 //assert( 0 && "Should not happen" );
42 //return 1; // FIXME ???
43 }
44
SetSpacing(const double * spacing)45 void Image::SetSpacing(const double *spacing)
46 {
47 assert( NumberOfDimensions );
48 Spacing.assign(spacing, spacing+NumberOfDimensions);
49 }
50
SetSpacing(unsigned int idx,double spacing)51 void Image::SetSpacing(unsigned int idx, double spacing)
52 {
53 //assert( spacing > 1.e3 );
54 Spacing.resize( 3 /*idx + 1*/ );
55 Spacing[idx] = spacing;
56 }
57
GetOrigin() const58 const double *Image::GetOrigin() const
59 {
60 assert( NumberOfDimensions );
61 if( !Origin.empty() )
62 return &Origin[0];
63 return nullptr;
64 }
65
GetOrigin(unsigned int idx) const66 double Image::GetOrigin(unsigned int idx) const
67 {
68 assert( NumberOfDimensions );
69 if( idx < Origin.size() )
70 {
71 return Origin[idx];
72 }
73 return 0; // FIXME ???
74 }
75
SetOrigin(const float * ori)76 void Image::SetOrigin(const float *ori)
77 {
78 assert( NumberOfDimensions );
79 Origin.resize( NumberOfDimensions );
80 for(unsigned int i = 0; i < NumberOfDimensions; ++i)
81 {
82 Origin[i] = static_cast<double>(ori[i]);
83 }
84 }
85
SetOrigin(const double * ori)86 void Image::SetOrigin(const double *ori)
87 {
88 assert( NumberOfDimensions );
89 Origin.assign(ori, ori+NumberOfDimensions);
90 }
91
SetOrigin(unsigned int idx,double ori)92 void Image::SetOrigin(unsigned int idx, double ori)
93 {
94 Origin.resize( idx + 1 );
95 Origin[idx] = ori;
96 }
97
GetDirectionCosines() const98 const double *Image::GetDirectionCosines() const
99 {
100 assert( NumberOfDimensions );
101 if( !DirectionCosines.empty() )
102 return &DirectionCosines[0];
103 return nullptr;
104 }
GetDirectionCosines(unsigned int idx) const105 double Image::GetDirectionCosines(unsigned int idx) const
106 {
107 assert( NumberOfDimensions );
108 if( idx < DirectionCosines.size() )
109 {
110 return DirectionCosines[idx];
111 }
112 return 0; // FIXME !!
113 }
114
SetDirectionCosines(const float * dircos)115 void Image::SetDirectionCosines(const float *dircos)
116 {
117 assert( NumberOfDimensions );
118 DirectionCosines.resize( 6 );
119 for(int i = 0; i < 6; ++i)
120 {
121 DirectionCosines[i] = static_cast<double>(dircos[i]);
122 }
123 }
124
SetDirectionCosines(const double * dircos)125 void Image::SetDirectionCosines(const double *dircos)
126 {
127 assert( NumberOfDimensions );
128 DirectionCosines.assign(dircos, dircos+6);
129 }
130
SetDirectionCosines(unsigned int idx,double dircos)131 void Image::SetDirectionCosines(unsigned int idx, double dircos)
132 {
133 DirectionCosines.resize( idx + 1 );
134 DirectionCosines[idx] = dircos;
135 }
136
Print(std::ostream & os) const137 void Image::Print(std::ostream &os) const
138 {
139 Pixmap::Print(os);
140 if( NumberOfDimensions )
141 {
142 {
143 os << "Origin: (";
144 if( !Origin.empty() )
145 {
146 std::vector<double>::const_iterator it = Origin.begin();
147 os << *it;
148 for(++it; it != Origin.end(); ++it)
149 {
150 os << "," << *it;
151 }
152 }
153 os << ")\n";
154 }
155 {
156 os << "Spacing: (";
157 std::vector<double>::const_iterator it = Spacing.begin();
158 os << *it;
159 for(++it; it != Spacing.end(); ++it)
160 {
161 os << "," << *it;
162 }
163 os << ")\n";
164 }
165 {
166 os << "DirectionCosines: (";
167 if( !DirectionCosines.empty() )
168 {
169 std::vector<double>::const_iterator it = DirectionCosines.begin();
170 os << *it;
171 for(++it; it != DirectionCosines.end(); ++it)
172 {
173 os << "," << *it;
174 }
175 }
176 os << ")\n";
177 }
178 {
179 os << "Rescale Intercept/Slope: (" << Intercept << "," << Slope << ")\n";
180 }
181 //std::vector<double> Spacing;
182 //std::vector<double> Origin;
183
184 }
185 }
186
187 } // end namespace gdcm
188