1
/*=========================================================================
3
* Copyright Insight Software Consortium
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
* you may not use this file except in compliance with the License.
7
* You may obtain a copy of the License at
9
* http://www.apache.org/licenses/LICENSE-2.0.txt
11
* Unless required by applicable law or agreed to in writing, software
12
* distributed under the License is distributed on an "AS IS" BASIS,
13
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
* See the License for the specific language governing permissions and
15
* limitations under the License.
17
*=========================================================================*/
19
#pragma warning(disable:4996)
22
#include "sitkImportImageFilter.h"
23
#include "sitkExceptionObject.h"
26
#include <itkVectorImage.h>
33
const unsigned int UnusedDimension = 2;
41
const std::vector< unsigned int > &size,
42
const std::vector< double > &spacing,
43
const std::vector< double > &origin,
44
const std::vector< double > &direction,
45
unsigned int numberOfComponents
47
ImportImageFilter import;
48
import.SetSize( size );
49
import.SetSpacing( spacing );
50
import.SetOrigin( origin );
51
import.SetDirection( direction );
52
import.SetBufferAsInt8( buffer, numberOfComponents );
53
return import.Execute();
58
const std::vector< unsigned int > &size,
59
const std::vector< double > &spacing,
60
const std::vector< double > &origin,
61
const std::vector< double > &direction,
62
unsigned int numberOfComponents
64
ImportImageFilter import;
65
import.SetSize( size );
66
import.SetSpacing( spacing );
67
import.SetOrigin( origin );
68
import.SetDirection( direction );
69
import.SetBufferAsUInt8( buffer, numberOfComponents );
70
return import.Execute();
75
const std::vector< unsigned int > &size,
76
const std::vector< double > &spacing,
77
const std::vector< double > &origin,
78
const std::vector< double > &direction,
79
unsigned int numberOfComponents
81
ImportImageFilter import;
82
import.SetSize( size );
83
import.SetSpacing( spacing );
84
import.SetOrigin( origin );
85
import.SetDirection( direction );
86
import.SetBufferAsInt16( buffer, numberOfComponents );
87
return import.Execute();
92
const std::vector< unsigned int > &size,
93
const std::vector< double > &spacing,
94
const std::vector< double > &origin,
95
const std::vector< double > &direction,
96
unsigned int numberOfComponents
98
ImportImageFilter import;
99
import.SetSize( size );
100
import.SetSpacing( spacing );
101
import.SetOrigin( origin );
102
import.SetDirection( direction );
103
import.SetBufferAsUInt16( buffer, numberOfComponents );
104
return import.Execute();
109
const std::vector< unsigned int > &size,
110
const std::vector< double > &spacing,
111
const std::vector< double > &origin,
112
const std::vector< double > &direction,
113
unsigned int numberOfComponents
115
ImportImageFilter import;
116
import.SetSize( size );
117
import.SetSpacing( spacing );
118
import.SetOrigin( origin );
119
import.SetDirection( direction );
120
import.SetBufferAsInt32( buffer, numberOfComponents );
121
return import.Execute();
124
Image ImportAsUInt32(
126
const std::vector< unsigned int > &size,
127
const std::vector< double > &spacing,
128
const std::vector< double > &origin,
129
const std::vector< double > &direction,
130
unsigned int numberOfComponents
132
ImportImageFilter import;
133
import.SetSize( size );
134
import.SetSpacing( spacing );
135
import.SetOrigin( origin );
136
import.SetDirection( direction );
137
import.SetBufferAsUInt32( buffer, numberOfComponents );
138
return import.Execute();
143
const std::vector< unsigned int > &size,
144
const std::vector< double > &spacing,
145
const std::vector< double > &origin,
146
const std::vector< double > &direction,
147
unsigned int numberOfComponents
149
ImportImageFilter import;
150
import.SetSize( size );
151
import.SetSpacing( spacing );
152
import.SetOrigin( origin );
153
import.SetDirection( direction );
154
import.SetBufferAsInt64( buffer, numberOfComponents );
155
return import.Execute();
158
Image ImportAsUInt64(
160
const std::vector< unsigned int > &size,
161
const std::vector< double > &spacing,
162
const std::vector< double > &origin,
163
const std::vector< double > &direction,
164
unsigned int numberOfComponents
166
ImportImageFilter import;
167
import.SetSize( size );
168
import.SetSpacing( spacing );
169
import.SetOrigin( origin );
170
import.SetDirection( direction );
171
import.SetBufferAsUInt64( buffer, numberOfComponents );
172
return import.Execute();
177
const std::vector< unsigned int > &size,
178
const std::vector< double > &spacing,
179
const std::vector< double > &origin,
180
const std::vector< double > &direction,
181
unsigned int numberOfComponents
183
ImportImageFilter import;
184
import.SetSize( size );
185
import.SetSpacing( spacing );
186
import.SetOrigin( origin );
187
import.SetDirection( direction );
188
import.SetBufferAsFloat( buffer, numberOfComponents );
189
return import.Execute();
192
Image ImportAsDouble(
194
const std::vector< unsigned int > &size,
195
const std::vector< double > &spacing,
196
const std::vector< double > &origin,
197
const std::vector< double > &direction,
198
unsigned int numberOfComponents
200
ImportImageFilter import;
201
import.SetSize( size );
202
import.SetSpacing( spacing );
203
import.SetOrigin( origin );
204
import.SetDirection( direction );
205
import.SetBufferAsDouble( buffer, numberOfComponents );
206
return import.Execute();
209
ImportImageFilter::ImportImageFilter()
211
m_NumberOfComponentsPerPixel = 0;
212
m_PixelIDValue = sitkUnknown;
213
m_Origin = std::vector<double>( 3, 0.0 );
214
m_Spacing = std::vector<double>( 3, 1.0 );
215
this->m_Buffer = NULL;
217
// list of pixel types supported
218
typedef NonLabelPixelIDTypeList PixelIDTypeList;
220
this->m_MemberFactory.reset( new detail::MemberFunctionFactory<MemberFunctionType>( this ) );
222
this->m_MemberFactory->RegisterMemberFunctions< PixelIDTypeList, 4 > ();
223
this->m_MemberFactory->RegisterMemberFunctions< PixelIDTypeList, 3 > ();
224
this->m_MemberFactory->RegisterMemberFunctions< PixelIDTypeList, 2 > ();
228
ImportImageFilter::Self& ImportImageFilter::SetSpacing( const std::vector< double > &spacing )
230
this->m_Spacing = spacing;
234
const std::vector< double > &ImportImageFilter::GetSpacing( ) const
236
return this->m_Spacing;
239
ImportImageFilter::Self& ImportImageFilter::SetOrigin( const std::vector< double > &origin )
241
this->m_Origin = origin;
245
const std::vector< double > &ImportImageFilter::GetOrigin( ) const
247
return this->m_Origin;
250
ImportImageFilter::Self& ImportImageFilter::SetSize( const std::vector< unsigned int > &size )
256
const std::vector< unsigned int > &ImportImageFilter::GetSize( ) const
261
ImportImageFilter::Self& ImportImageFilter::SetDirection( const std::vector< double > &direction )
263
this->m_Direction = direction;
267
const std::vector< double > &ImportImageFilter::GetDirection( ) const
269
return this->m_Direction;
272
ImportImageFilter::Self& ImportImageFilter::SetBufferAsInt8( int8_t * buffer, unsigned int numberOfComponents )
274
this->m_Buffer = buffer;
275
this->m_NumberOfComponentsPerPixel = numberOfComponents;
276
if ( this->m_NumberOfComponentsPerPixel == 1 )
278
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<int8_t, UnusedDimension> >::Result;
282
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<int8_t, UnusedDimension> >::Result;
286
ImportImageFilter::Self& ImportImageFilter::SetBufferAsUInt8( uint8_t * buffer, unsigned int numberOfComponents )
288
this->m_Buffer = buffer;
289
this->m_NumberOfComponentsPerPixel = numberOfComponents;
290
if ( this->m_NumberOfComponentsPerPixel == 1 )
292
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<uint8_t, UnusedDimension> >::Result;
296
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<uint8_t, UnusedDimension> >::Result;
300
ImportImageFilter::Self& ImportImageFilter::SetBufferAsInt16( int16_t * buffer, unsigned int numberOfComponents )
302
this->m_Buffer = buffer;
303
this->m_NumberOfComponentsPerPixel = numberOfComponents;
304
if ( this->m_NumberOfComponentsPerPixel == 1 )
306
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<int16_t, UnusedDimension> >::Result;
310
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<int16_t, UnusedDimension> >::Result;
314
ImportImageFilter::Self& ImportImageFilter::SetBufferAsUInt16( uint16_t * buffer, unsigned int numberOfComponents )
316
this->m_Buffer = buffer;
317
this->m_NumberOfComponentsPerPixel = numberOfComponents;
318
if ( this->m_NumberOfComponentsPerPixel == 1 )
320
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<uint16_t, UnusedDimension> >::Result;
324
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<uint16_t, UnusedDimension> >::Result;
328
ImportImageFilter::Self& ImportImageFilter::SetBufferAsInt32( int32_t * buffer, unsigned int numberOfComponents )
330
this->m_Buffer = buffer;
331
this->m_NumberOfComponentsPerPixel = numberOfComponents;
332
if ( this->m_NumberOfComponentsPerPixel == 1 )
334
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<int32_t, UnusedDimension> >::Result;
338
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<int32_t, UnusedDimension> >::Result;
342
ImportImageFilter::Self& ImportImageFilter::SetBufferAsUInt32( uint32_t * buffer, unsigned int numberOfComponents )
344
this->m_Buffer = buffer;
345
this->m_NumberOfComponentsPerPixel = numberOfComponents;
346
if ( this->m_NumberOfComponentsPerPixel == 1 )
348
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<uint32_t, UnusedDimension> >::Result;
352
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<uint32_t, UnusedDimension> >::Result;
356
ImportImageFilter::Self& ImportImageFilter::SetBufferAsInt64( int64_t * buffer, unsigned int numberOfComponents )
358
this->m_Buffer = buffer;
359
this->m_NumberOfComponentsPerPixel = numberOfComponents;
360
if ( this->m_NumberOfComponentsPerPixel == 1 )
362
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<int64_t, UnusedDimension> >::Result;
366
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<int64_t, UnusedDimension> >::Result;
370
ImportImageFilter::Self& ImportImageFilter::SetBufferAsUInt64( uint64_t * buffer, unsigned int numberOfComponents )
372
this->m_Buffer = buffer;
373
this->m_NumberOfComponentsPerPixel = numberOfComponents;
374
if ( this->m_NumberOfComponentsPerPixel == 1 )
376
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<uint64_t, UnusedDimension> >::Result;
380
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<uint64_t, UnusedDimension> >::Result;
385
ImportImageFilter::Self& ImportImageFilter::SetBufferAsFloat( float * buffer, unsigned int numberOfComponents )
387
this->m_Buffer = buffer;
388
this->m_NumberOfComponentsPerPixel = numberOfComponents;
389
if ( this->m_NumberOfComponentsPerPixel == 1 )
391
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<float, UnusedDimension> >::Result;
395
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<float, UnusedDimension> >::Result;
399
ImportImageFilter::Self& ImportImageFilter::SetBufferAsDouble( double * buffer, unsigned int numberOfComponents )
401
this->m_Buffer = buffer;
402
this->m_NumberOfComponentsPerPixel = numberOfComponents;
403
if ( this->m_NumberOfComponentsPerPixel == 1 )
405
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::Image<double, UnusedDimension> >::Result;
409
this->m_PixelIDValue = ImageTypeToPixelIDValue< itk::VectorImage<double, UnusedDimension> >::Result;
415
#define PRINT_IVAR_MACRO( VAR ) "\t" << #VAR << ": " << VAR << std::endl
417
std::string ImportImageFilter::ToString() const
419
std::ostringstream out;
421
out << "itk::simple::ImportImageFilter\n"
422
<< PRINT_IVAR_MACRO( m_NumberOfComponentsPerPixel )
423
<< PRINT_IVAR_MACRO( m_PixelIDValue )
424
<< PRINT_IVAR_MACRO( m_Origin )
425
<< PRINT_IVAR_MACRO( m_Spacing )
426
<< PRINT_IVAR_MACRO( m_Size )
427
<< PRINT_IVAR_MACRO( m_Direction )
428
<< PRINT_IVAR_MACRO( m_Buffer );
432
Image ImportImageFilter::Execute ()
434
unsigned int imageDimension = this->m_Size.size();
436
// perform sanity check on some parameters
437
if ( this->m_NumberOfComponentsPerPixel == 0 || this->m_PixelIDValue == sitkUnknown )
439
sitkExceptionMacro( << "PixelType or NumberOfComponentsPerPixel are invalid!" );
443
if ( imageDimension != 3 && imageDimension != 2 )
445
sitkExceptionMacro(<< "The length of size is invalid! "
446
<< "Only image of dimension 2 or 3 are supported." );
449
if ( !this->m_MemberFactory->HasMemberFunction( this->m_PixelIDValue, imageDimension ) )
451
sitkExceptionMacro( << "PixelType is not supported!" << std::endl
453
<< GetPixelIDValueAsString( this->m_PixelIDValue ) << std::endl
454
<< "Refusing to load! " << std::endl );
457
return this->m_MemberFactory->GetMemberFunction( this->m_PixelIDValue, imageDimension )();
461
template <class TImageType>
462
Image ImportImageFilter::ExecuteInternal( )
465
typedef TImageType ImageType;
466
const unsigned int Dimension = ImageType::ImageDimension;
468
// if the InstantiatedToken is correctly implemented this should
470
assert( ImageTypeToPixelIDValue<ImageType>::Result != (int)sitkUnknown );
472
typename ImageType::Pointer image = ImageType::New();
480
typename ImageType::PointType origin = sitkSTLVectorToITK< typename ImageType::PointType >( this->m_Origin );
481
image->SetOrigin( origin );
486
typename ImageType::SpacingType spacing = sitkSTLVectorToITK< typename ImageType::SpacingType >( this->m_Spacing );
487
image->SetSpacing( spacing );
492
typename ImageType::RegionType region;
493
typename ImageType::SizeType size = sitkSTLVectorToITK< typename ImageType::SizeType >( this->m_Size );
494
region.SetSize(size);
495
// set the size and region to the ITK image.
496
image->SetRegions( region );
499
// Direction, if m_Direction is not set, use ITK's default which is
502
if (this->m_Direction.size() != 0 )
504
image->SetDirection( sitkSTLToITKDirection<typename ImageType::DirectionType>( this->m_Direction ) );
508
size_t numberOfElements = m_NumberOfComponentsPerPixel;
509
for(unsigned int si = 0; si < Dimension; si++ )
511
numberOfElements *= size[si];
514
const bool TheContainerWillTakeCareOfDeletingTheMemoryBuffer = false;
516
// Set the image's pixel container to import the pointer provided.
517
image->GetPixelContainer()->SetImportPointer(static_cast<typename ImageType::InternalPixelType*>(m_Buffer), numberOfElements,
518
TheContainerWillTakeCareOfDeletingTheMemoryBuffer);
522
// Meta-programmed method to set the number of components if a
525
this->SetNumberOfComponentsOnImage( image.GetPointer() );
527
// This line must be the last line in the function to prevent a deep
528
// copy caused by a implicit sitk::MakeUnique
529
return Image( image );
532
template <class TFilterType>
533
typename EnableIf<IsVector<TFilterType>::Value>::Type
534
ImportImageFilter::SetNumberOfComponentsOnImage ( TFilterType*image )
536
image->SetNumberOfComponentsPerPixel( m_NumberOfComponentsPerPixel );