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 "mitkRawImageFileReader.h"
00020 #include "mitkITKImageImport.h"
00021
00022 #include <itkImage.h>
00023 #include <itkRawImageIO.h>
00024 #include <itkImageFileReader.h>
00025
00026 mitk::RawImageFileReader::RawImageFileReader()
00027 : m_FileName(""), m_FilePrefix(""), m_FilePattern("")
00028 {
00029 }
00030
00031 mitk::RawImageFileReader::~RawImageFileReader()
00032 {
00033 }
00034
00035 void mitk::RawImageFileReader::SetDimensions(unsigned int i, unsigned int dim)
00036 {
00037 if ( i > 2 ) return;
00038
00039 this->Modified();
00040 m_Dimensions[i] = dim;
00041 }
00042
00043
00044 unsigned int mitk::RawImageFileReader::GetDimensions(unsigned int i) const
00045 {
00046 if ( i > 2 ) return 0;
00047
00048 return m_Dimensions[i];
00049 }
00050
00051 bool mitk::RawImageFileReader::CanReadFile(const std::string filename, const std::string filePrefix, const std::string filePattern)
00052 {
00053
00054 if( filename == "" )
00055 return false;
00056
00057
00058 if( filePattern != "" && filePrefix != "" )
00059 return false;
00060
00061 return true;
00062 }
00063
00064 void mitk::RawImageFileReader::GenerateData()
00065 {
00066 mitk::Image::Pointer output = this->GetOutput();
00067
00068 if (this->GetOutput()==NULL)
00069 {
00070 MITK_INFO << "Error" << std::endl;
00071 }
00072
00073
00074 if ( m_FileName == "" )
00075 {
00076 itkWarningMacro( << "File Type not supported!" );
00077 return ;
00078 }
00079
00080
00081 if (m_Dimensionality == 2)
00082 {
00083 if (m_PixelType == SCHAR) TypedGenerateData<signed char, 2 >();
00084 else if (m_PixelType == UCHAR) TypedGenerateData<unsigned char, 2 >();
00085 else if (m_PixelType == SSHORT) TypedGenerateData<signed short int, 2 >();
00086 else if (m_PixelType == USHORT) TypedGenerateData<unsigned short int, 2 >();
00087 else if (m_PixelType == UINT) TypedGenerateData<unsigned int, 2 >();
00088 else if (m_PixelType == SINT) TypedGenerateData<signed int, 2 >();
00089 else if (m_PixelType == FLOAT) TypedGenerateData<float, 2 >();
00090 else if (m_PixelType == DOUBLE) TypedGenerateData<double, 2 >();
00091 else
00092 {
00093 MITK_INFO << "Error while reading raw file: Dimensionality or pixel type not supported or not properly set" << std::endl;
00094 return;
00095 }
00096 }
00097 else if (m_Dimensionality==3)
00098 {
00099 if (m_PixelType == SCHAR) TypedGenerateData<signed char, 3 >();
00100 else if (m_PixelType == UCHAR) TypedGenerateData<unsigned char, 3 >();
00101 else if (m_PixelType == SSHORT) TypedGenerateData<signed short int, 3 >();
00102 else if (m_PixelType == USHORT) TypedGenerateData<unsigned short int, 3 >();
00103 else if (m_PixelType == UINT) TypedGenerateData<unsigned int, 3 >();
00104 else if (m_PixelType == SINT) TypedGenerateData<signed int, 3 >();
00105 else if (m_PixelType == FLOAT) TypedGenerateData<float, 3 >();
00106 else if (m_PixelType == DOUBLE) TypedGenerateData<double, 3 >();
00107 else
00108 {
00109 MITK_INFO << "Error while reading raw file: Dimensionality or pixel type not supported or not properly set" << std::endl;
00110 return;
00111 }
00112 }
00113 else
00114 {
00115 MITK_INFO << "Error while reading raw file: Dimensionality not supported" << std::endl;
00116 return;
00117
00118 }
00119
00120 MITK_INFO << "...reading raw finished!" << std::endl;
00121 }
00122
00123 template < typename TPixel, unsigned int VImageDimensions >
00124 void mitk::RawImageFileReader::TypedGenerateData()
00125 {
00126 mitk::Image::Pointer output = this->GetOutput();
00127
00128 if (this->GetOutput()==NULL)
00129 {
00130 MITK_INFO << "Error" << std::endl;
00131 }
00132
00133 MITK_INFO << "loading " << m_FileName << " via itk::ImageIOFactory... " << std::endl;
00134
00135
00136 if ( m_FileName == "" )
00137 {
00138 itkWarningMacro( << "File Type not supported!" );
00139 return ;
00140 }
00141
00142 typedef itk::Image< TPixel, VImageDimensions > ImageType;
00143 typedef itk::ImageFileReader< ImageType > ReaderType;
00144 typedef itk::RawImageIO< TPixel, VImageDimensions > IOType;
00145
00146 typename ReaderType::Pointer reader = ReaderType::New();
00147 typename IOType::Pointer io = IOType::New();
00148
00149 io->SetFileDimensionality(VImageDimensions);
00150
00151 for (unsigned short int dim = 0; dim < VImageDimensions; ++dim)
00152 {
00153 io->SetDimensions(dim, m_Dimensions[dim] );
00154 }
00155
00156 if (m_Endianity == LITTLE)
00157 {
00158 io->SetByteOrderToLittleEndian();
00159 }
00160 else if (m_Endianity == BIG)
00161 {
00162 io->SetByteOrderToBigEndian();
00163 }
00164 else
00165 {
00166 MITK_INFO << "Warning: endianity not properly set. Resulting image might be incorrect";
00167 }
00168
00169 reader->SetImageIO( io );
00170 reader->SetFileName(m_FileName.c_str());
00171
00172 try
00173 {
00174 reader->Update();
00175 }
00176 catch( itk::ExceptionObject & err )
00177 {
00178 MITK_ERROR <<"An error occurred during the raw image reading process: ";
00179 MITK_INFO << err << std::endl;
00180 }
00181
00182 mitk::Image::Pointer image = mitk::Image::New();
00183 mitk::CastToMitkImage(reader->GetOutput(), image);
00184 output->Initialize( image );
00185 output->SetVolume( reader->GetOutput()->GetBufferPointer());
00186 }
00187