Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkItkImageFileReader.h"
00020 #include "mitkConfig.h"
00021
00022 #include <itkImageFileReader.h>
00023 #include <itksys/SystemTools.hxx>
00024 #include <itksys/Directory.hxx>
00025 #include <itkImage.h>
00026
00027 #include <itkImageFileReader.h>
00028 #include <itkImageIOFactory.h>
00029 #include <itkImageIORegion.h>
00030
00031
00032
00033
00034
00035
00036
00037
00038 void mitk::ItkImageFileReader::GenerateData()
00039 {
00040 mitk::Image::Pointer image = this->GetOutput();
00041
00042 const unsigned int MINDIM = 2;
00043 const unsigned int MAXDIM = 4;
00044
00045 MITK_INFO << "loading " << m_FileName << " via itk::ImageIOFactory... " << std::endl;
00046
00047
00048 if ( m_FileName == "" )
00049 {
00050 itkWarningMacro( << "File Type not supported!" );
00051 return ;
00052 }
00053
00054 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO( m_FileName.c_str(), itk::ImageIOFactory::ReadMode );
00055 if ( imageIO.IsNull() )
00056 {
00057 itkWarningMacro( << "File Type not supported!" );
00058 return ;
00059 }
00060
00061
00062
00063 imageIO->SetFileName( m_FileName.c_str() );
00064 imageIO->ReadImageInformation();
00065
00066 unsigned int ndim = imageIO->GetNumberOfDimensions();
00067 if ( ndim < MINDIM || ndim > MAXDIM )
00068 {
00069 itkWarningMacro( << "Sorry, only dimensions 2, 3 and 4 are supported. The given file has " << ndim << " dimensions! Reading as 4D." );
00070 ndim = MAXDIM;
00071 }
00072
00073 itk::ImageIORegion ioRegion( ndim );
00074 itk::ImageIORegion::SizeType ioSize = ioRegion.GetSize();
00075 itk::ImageIORegion::IndexType ioStart = ioRegion.GetIndex();
00076
00077 unsigned int dimensions[ MAXDIM ];
00078 dimensions[ 0 ] = 0;
00079 dimensions[ 1 ] = 0;
00080 dimensions[ 2 ] = 0;
00081 dimensions[ 3 ] = 0;
00082
00083 float spacing[ MAXDIM ];
00084 spacing[ 0 ] = 1.0f;
00085 spacing[ 1 ] = 1.0f;
00086 spacing[ 2 ] = 1.0f;
00087 spacing[ 3 ] = 1.0f;
00088
00089 Point3D origin;
00090 origin.Fill(0);
00091
00092 unsigned int i;
00093 for ( i = 0; i < ndim ; ++i )
00094 {
00095 ioStart[ i ] = 0;
00096 ioSize[ i ] = imageIO->GetDimensions( i );
00097 if(i<MAXDIM)
00098 {
00099 dimensions[ i ] = imageIO->GetDimensions( i );
00100 spacing[ i ] = imageIO->GetSpacing( i );
00101 if(spacing[ i ] <= 0)
00102 spacing[ i ] = 1.0f;
00103 }
00104 if(i<3)
00105 {
00106 origin[ i ] = imageIO->GetOrigin( i );
00107 }
00108 }
00109
00110 ioRegion.SetSize( ioSize );
00111 ioRegion.SetIndex( ioStart );
00112
00113 MITK_INFO << "ioRegion: " << ioRegion << std::endl;
00114 imageIO->SetIORegion( ioRegion );
00115 void* buffer = new unsigned char[imageIO->GetImageSizeInBytes()];
00116 imageIO->Read( buffer );
00117
00118 if((ndim==4) && (dimensions[3]<=1))
00119 ndim = 3;
00120 if((ndim==3) && (dimensions[2]<=1))
00121 ndim = 2;
00122 mitk::PixelType pixelType( imageIO->GetComponentTypeInfo(), imageIO->GetNumberOfComponents(), imageIO->GetPixelType() );
00123 image->Initialize( pixelType, ndim, dimensions );
00124 image->SetImportChannel( buffer, 0, Image::ManageMemory );
00125
00126
00127 mitk::Matrix3D matrix;
00128 matrix.SetIdentity();
00129 unsigned int j, itkDimMax3 = (ndim >= 3? 3 : ndim);
00130 for ( i=0; i < itkDimMax3; ++i)
00131 for( j=0; j < itkDimMax3; ++j )
00132 matrix[i][j] = imageIO->GetDirection(j)[i];
00133
00134
00135 PlaneGeometry* planeGeometry = static_cast<PlaneGeometry*>(image->GetSlicedGeometry(0)->GetGeometry2D(0));
00136 planeGeometry->SetOrigin(origin);
00137 planeGeometry->GetIndexToWorldTransform()->SetMatrix(matrix);
00138
00139
00140 SlicedGeometry3D* slicedGeometry = image->GetSlicedGeometry(0);
00141 slicedGeometry->InitializeEvenlySpaced(planeGeometry, image->GetDimension(2));
00142 slicedGeometry->SetSpacing(spacing);
00143
00144
00145 image->GetTimeSlicedGeometry()->InitializeEvenlyTimed(slicedGeometry, image->GetDimension(3));
00146
00147 buffer = NULL;
00148 MITK_INFO << "number of image components: "<< image->GetPixelType().GetNumberOfComponents() << std::endl;
00149
00150
00151
00152
00153
00154
00155
00156
00157 MITK_INFO << "...finished!" << std::endl;
00158 }
00159
00160
00161 bool mitk::ItkImageFileReader::CanReadFile(const std::string filename, const std::string filePrefix, const std::string filePattern)
00162 {
00163
00164 if( filename == "" )
00165 return false;
00166
00167
00168 if( filePattern != "" && filePrefix != "" )
00169 return false;
00170
00171 itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO( filename.c_str(), itk::ImageIOFactory::ReadMode );
00172 if ( imageIO.IsNull() )
00173 return false;
00174
00175 return true;
00176 }
00177
00178 mitk::ItkImageFileReader::ItkImageFileReader()
00179 : m_FileName(""), m_FilePrefix(""), m_FilePattern("")
00180 {
00181 }
00182
00183 mitk::ItkImageFileReader::~ItkImageFileReader()
00184 {
00185 }