16 #include "itksys/SystemTools.hxx" 17 #include "itkNrrdImageIO.h" 21 ToFNrrdImageWriter::ToFNrrdImageWriter(): ToFImageWriter(),
22 m_DistanceOutfile(), m_AmplitudeOutfile(), m_IntensityOutfile()
27 ToFNrrdImageWriter::~ToFNrrdImageWriter()
83 void ToFNrrdImageWriter::Add(
float* distanceFloatData,
float* amplitudeFloatData,
float* intensityFloatData,
unsigned char* rgbData)
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 )
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;
149 unsigned int dimension;
150 unsigned int* dimensions;
154 dimensions =
new unsigned int[dimension];
155 dimensions[0] = CaptureWidth;
156 dimensions[1] = CaptureHeight;
163 dimensions =
new unsigned int[dimension];
164 dimensions[0] = CaptureWidth;
165 dimensions[1] = CaptureHeight;
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;
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;
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( (itk::ImageIOBase::IOComponentType) 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]);
217 direction.SetVnlVector(imageTemplate->GetGeometry()->GetIndexToWorldTransform()->GetMatrix().GetVnlMatrix().get_column(i));
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);
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);
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)
void Add(float *distanceFloatData, float *amplitudeFloatData, float *intensityFloatData, unsigned char *rgbData=nullptr) override
Add new data to file.
int m_RGBImageSizeInBytes
size of the image to save in bytes
bool m_AmplitudeImageSelected
flag indicating if amplitude image should be recorded
int m_NumOfFrames
number of frames written to the image. Used for pic header.
bool m_IntensityImageSelected
flag indicating if intensity image should be recorded
void CheckForFileExtension(std::string &fileName)
Checks file name if file extension exists. If not an error message is returned.
bool m_DistanceImageSelected
flag indicating if distance image should be recorded
DataCollection - Class to facilitate loading/accessing structured data.
int m_RGBPixelNumber
number of pixels (widht*height) of the images to record
int m_ToFCaptureWidth
width (x-dimension) of the images to record.
int m_ToFCaptureHeight
height (y-dimension) of the images to record.
int m_RGBCaptureHeight
height (y-dimension) of the images to record.
std::string m_IntensityImageFileName
file name for saving the intensity image
bool m_RGBImageSelected
flag indicating if RGB image should be recorded
std::string m_AmplitudeImageFileName
file name for saving the amplitude image
int m_ToFPixelNumber
number of pixels (widht*height) of the images to record
std::string m_Extension
file extension used for saving images
std::string m_DistanceImageFileName
file name for saving the distance image
int m_ToFImageSizeInBytes
size of the image to save in bytes
std::string m_RGBImageFileName
file name for saving the RGB image
ToFImageWriter::ToFImageType m_ToFImageType
type of image to be recorded: ToFImageType3D (0) or ToFImageType2DPlusT (1)
int m_RGBCaptureWidth
width (x-dimension) of the images to record.
void Close() override
Close file(s) add .pic header and write.
Class for defining the data type of pixels.
void Open() override
Open file(s) for writing.