16#include "itksys/SystemTools.hxx"
17#include "itkNrrdImageIO.h"
21 ToFNrrdImageWriter::ToFNrrdImageWriter(): ToFImageWriter(),
22 m_DistanceOutfile(), m_AmplitudeOutfile(), m_IntensityOutfile()
24 m_Extension = std::string(
".nrrd");
27 ToFNrrdImageWriter::~ToFNrrdImageWriter()
31 void ToFNrrdImageWriter::Open()
33 this->CheckForFileExtension(this->m_DistanceImageFileName);
34 this->CheckForFileExtension(this->m_AmplitudeImageFileName);
35 this->CheckForFileExtension(this->m_IntensityImageFileName);
36 this->CheckForFileExtension(this->m_RGBImageFileName);
38 this->m_ToFPixelNumber = this->m_ToFCaptureWidth * this->m_ToFCaptureHeight;
39 this->m_ToFImageSizeInBytes = this->m_ToFPixelNumber *
sizeof(float);
41 this->m_RGBPixelNumber = this->m_RGBCaptureWidth * this->m_RGBCaptureHeight;
42 this->m_RGBImageSizeInBytes = this->m_RGBPixelNumber *
sizeof(
unsigned char) * 3;
44 if (this->m_DistanceImageSelected)
46 this->OpenStreamFile( this->m_DistanceOutfile, this->m_DistanceImageFileName);
48 if (this->m_AmplitudeImageSelected)
50 this->OpenStreamFile(this->m_AmplitudeOutfile, this->m_AmplitudeImageFileName);
52 if (this->m_IntensityImageSelected)
54 this->OpenStreamFile(this->m_IntensityOutfile, this->m_IntensityImageFileName);
56 if (this->m_RGBImageSelected)
58 this->OpenStreamFile(this->m_RGBOutfile, this->m_RGBImageFileName);
60 this->m_NumOfFrames = 0;
63 void ToFNrrdImageWriter::Close()
65 if (this->m_DistanceImageSelected)
67 this->CloseStreamFile(this->m_DistanceOutfile, this->m_DistanceImageFileName);
69 if (this->m_AmplitudeImageSelected)
71 this->CloseStreamFile(this->m_AmplitudeOutfile, this->m_AmplitudeImageFileName);
73 if (this->m_IntensityImageSelected)
75 this->CloseStreamFile(this->m_IntensityOutfile, this->m_IntensityImageFileName);
77 if (this->m_RGBImageSelected)
79 this->CloseStreamFile(this->m_RGBOutfile, this->m_RGBImageFileName);
83 void ToFNrrdImageWriter::Add(
float* distanceFloatData,
float* amplitudeFloatData,
float* intensityFloatData,
unsigned char* rgbData)
85 if (this->m_DistanceImageSelected)
87 this->m_DistanceOutfile.write( (
char*) distanceFloatData, this->m_ToFImageSizeInBytes);
89 if (this->m_AmplitudeImageSelected)
91 this->m_AmplitudeOutfile.write( (
char*)amplitudeFloatData, this->m_ToFImageSizeInBytes);
93 if (this->m_IntensityImageSelected)
95 this->m_IntensityOutfile.write((
char* )intensityFloatData, this->m_ToFImageSizeInBytes);
97 if (this->m_RGBImageSelected)
99 this->m_RGBOutfile.write((
char* )rgbData, this->m_RGBImageSizeInBytes);
101 this->m_NumOfFrames++;
104 void ToFNrrdImageWriter::OpenStreamFile( std::ofstream &outfile, std::string outfileName )
106 outfile.open(outfileName.c_str(), std::ofstream::binary);
107 if(!outfile.is_open())
109 MITK_ERROR <<
"Error opening outfile: " << outfileName;
110 throw std::logic_error(
"Error opening outfile.");
115 void ToFNrrdImageWriter::CloseStreamFile( std::ofstream &outfile, std::string fileName )
117 if (this->m_NumOfFrames == 0)
120 throw std::logic_error(
"File is empty.");
126 this->ConvertStreamToNrrdFormat( fileName );
130 void ToFNrrdImageWriter::ConvertStreamToNrrdFormat( std::string fileName )
132 int CaptureWidth = 0;
133 int CaptureHeight = 0;
136 if (fileName==this->m_RGBImageFileName)
138 CaptureWidth = this->m_RGBCaptureWidth;
139 CaptureHeight = this->m_RGBCaptureHeight;
140 PixelNumber = this->m_RGBPixelNumber;
144 CaptureWidth = this->m_ToFCaptureWidth;
145 CaptureHeight = this->m_ToFCaptureHeight;
146 PixelNumber = this->m_ToFPixelNumber;
148 Image::Pointer imageTemplate = Image::New();
149 unsigned int dimension;
150 unsigned int* dimensions;
151 if(m_ToFImageType == ToFImageType2DPlusT)
154 dimensions =
new unsigned int[dimension];
155 dimensions[0] = CaptureWidth;
156 dimensions[1] = CaptureHeight;
158 dimensions[3] = this->m_NumOfFrames;
160 else if( m_ToFImageType == ToFImageType3D)
163 dimensions =
new unsigned int[dimension];
164 dimensions[0] = CaptureWidth;
165 dimensions[1] = CaptureHeight;
166 dimensions[2] = this->m_NumOfFrames;
170 throw std::logic_error(
"No image type set, please choose between 2D+t and 3D!");
172 float* floatData =
nullptr;
173 unsigned char* rgbData =
nullptr;
174 if (fileName==this->m_RGBImageFileName)
176 rgbData =
new unsigned char[PixelNumber*3];
177 for(
int i=0; i<PixelNumber*3; i++)
179 rgbData[i] = i + 0.0;
181 mitk::PixelType RGBType = MakePixelType<unsigned char, itk::RGBPixel<unsigned char>, 3>();
182 imageTemplate->Initialize( RGBType,dimension, dimensions, 1);
183 imageTemplate->SetSlice(rgbData, 0, 0, 0);
187 floatData =
new float[PixelNumber];
188 for(
int i=0; i<PixelNumber; i++)
190 floatData[i] = i + 0.0;
192 mitk::PixelType FloatType = MakeScalarPixelType<float>();
193 imageTemplate->Initialize( FloatType,dimension, dimensions, 1);
194 imageTemplate->SetSlice(floatData, 0, 0, 0);
197 itk::NrrdImageIO::Pointer nrrdWriter = itk::NrrdImageIO::New();
198 nrrdWriter->SetNumberOfDimensions(dimension);
199 nrrdWriter->SetPixelType( imageTemplate->GetPixelType().GetPixelType());
200 nrrdWriter->SetComponentType( imageTemplate->GetPixelType().GetComponentType());
201 if(imageTemplate->GetPixelType().GetNumberOfComponents() > 1)
203 nrrdWriter->SetNumberOfComponents(imageTemplate->GetPixelType().GetNumberOfComponents());
206 itk::ImageIORegion ioRegion( dimension );
207 mitk::Vector3D spacing = imageTemplate->GetGeometry()->GetSpacing();
208 mitk::Point3D origin = imageTemplate->GetGeometry()->GetOrigin();
210 for(
unsigned int i = 0; i < dimension; i++)
212 nrrdWriter->SetDimensions(i,dimensions[i]);
213 nrrdWriter->SetSpacing(i,spacing[i]);
214 nrrdWriter->SetOrigin(i,origin[i]);
216 mitk::Vector3D direction(0.0);
217 direction.SetVnlVector(imageTemplate->GetGeometry()->GetIndexToWorldTransform()->GetMatrix().GetVnlMatrix().get_column(i).as_ref());
218 vnl_vector< double > axisDirection(dimension);
220 for(
unsigned int j = 0; j < dimension; j++)
222 axisDirection[j] = direction[j]/spacing[i];
224 nrrdWriter->SetDirection( i, axisDirection );
226 ioRegion.SetSize(i, imageTemplate->GetLargestPossibleRegion().GetSize(i) );
227 ioRegion.SetIndex(i, imageTemplate->GetLargestPossibleRegion().GetIndex(i) );
230 nrrdWriter->SetIORegion(ioRegion);
231 nrrdWriter->SetFileName(fileName);
232 nrrdWriter->SetUseStreamedWriting(
true);
234 std::ifstream stream(fileName.c_str(), std::ifstream::binary);
235 if (fileName==m_RGBImageFileName)
237 unsigned int size = PixelNumber*3 * this->m_NumOfFrames;
238 unsigned int sizeInBytes = size *
sizeof(
unsigned char);
239 unsigned char* data =
new unsigned char[size];
240 stream.read((
char*)data, sizeInBytes);
241 nrrdWriter->Write(data);
247 unsigned int size = PixelNumber * this->m_NumOfFrames;
248 unsigned int sizeInBytes = size *
sizeof(float);
249 float* data =
new float[size];
250 stream.read((
char*)data, sizeInBytes);
253 nrrdWriter->Write(data);
255 catch (itk::ExceptionObject* e)
257 MITK_ERROR<< e->what();
266 if (fileName==m_RGBImageFileName)