22 #include <itkImageIOBase.h> 23 #include <itkImageIOFactory.h> 27 this->SetNumberOfRequiredInputs(1);
38 if (fileName && (fileName == this->
m_FileName))
47 std::size_t pos = this->
m_FileName.find_last_of(
"/\\");
48 if (pos != std::string::npos)
50 std::size_t ppos = this->
m_FileName.find_first_of(
'.', pos);
51 if (ppos != std::string::npos)
103 #include <vtkConfigure.h> 104 #include <vtkImageData.h> 105 #include <vtkXMLImageDataWriter.h> 108 vtkXMLImageDataWriter *vtkwriter = vtkXMLImageDataWriter::New();
109 vtkwriter->SetFileName(filename);
115 #include <itkRGBAPixel.h> 119 MITK_INFO <<
"Writing image: " << fileName << std::endl;
122 if (fileName.find(
".png") != std::string::npos || fileName.find(
".tif") != std::string::npos ||
123 fileName.find(
".jpg") != std::string::npos || fileName.find(
".bmp") != std::string::npos)
140 catch (itk::ExceptionObject &e)
142 std::cerr <<
"Caught " << e.what() << std::endl;
144 catch (std::exception &e)
146 std::cerr <<
"Caught std::exception " << e.what() << std::endl;
162 itk::Vector<double, 4u> spacing4D;
163 spacing4D[0] = mitkSpacing[0];
164 spacing4D[1] = mitkSpacing[1];
165 spacing4D[2] = mitkSpacing[2];
168 itk::Vector<double, 4u> origin4D;
169 origin4D[0] = mitkOrigin[0];
170 origin4D[1] = mitkOrigin[1];
171 origin4D[2] = mitkOrigin[2];
174 itk::ImageIOBase::Pointer imageIO =
175 itk::ImageIOFactory::CreateImageIO(fileName.c_str(), itk::ImageIOFactory::WriteMode);
177 if (imageIO.IsNull())
179 itkExceptionMacro(<<
"Error: Could not create itkImageIO via factory for file " << fileName);
183 imageIO->SetNumberOfDimensions(dimension);
186 static_cast<itk::ImageIOBase::IOComponentType
>(pixelType.
GetComponentType()) :
187 itk::ImageIOBase::UNKNOWNCOMPONENTTYPE);
190 itk::ImageIORegion ioRegion(dimension);
192 for (
unsigned int i = 0; i < dimension; i++)
194 imageIO->SetDimensions(i, dimensions[i]);
195 imageIO->SetSpacing(i, spacing4D[i]);
196 imageIO->SetOrigin(i, origin4D[i]);
199 mitkDirection.SetVnlVector(
201 itk::Vector<double, 4u> direction4D;
202 direction4D[0] = mitkDirection[0];
203 direction4D[1] = mitkDirection[1];
204 direction4D[2] = mitkDirection[2];
213 vnl_vector<double> axisDirection(dimension);
214 for (
unsigned int j = 0; j < dimension; j++)
216 axisDirection[j] = direction4D[j] / spacing4D[i];
218 imageIO->SetDirection(i, axisDirection);
227 imageIO->SetIORegion(ioRegion);
228 imageIO->SetFileName(fileName);
231 imageIO->Write(imageAccess.
GetData());
240 itkWarningMacro(<<
"Sorry, filename has not been set!");
244 FILE *tempFile = fopen(
m_FileName.c_str(),
"w");
245 if (tempFile ==
nullptr)
247 itkExceptionMacro(<<
"File location not writeable");
257 if (input->GetDimension() == 2)
259 if (!input->GetGeometry()->Is2DConvertable())
261 MITK_WARN <<
"Saving a 2D image with 3D geometry information. Geometry information will be lost! You might " 262 "consider using Convert2Dto3DImageFilter before saving.";
265 mitk::AffineTransform3D::Pointer affTrans = mitk::AffineTransform3D::New();
266 affTrans->SetIdentity();
269 input->GetGeometry()->SetIndexToWorldTransform(affTrans);
270 input->GetGeometry()->SetSpacing(spacing);
271 input->GetGeometry()->SetOrigin(origin);
275 bool vti = (
m_Extension.find(
".vti") != std::string::npos);
281 if (input->GetDimension() > 3)
285 timesteps = input->GetDimension(3);
287 timeSelector->SetInput(input);
289 for (t = 0; t < timesteps; ++t)
291 std::ostringstream filename;
292 timeSelector->SetTimeNr(t);
293 timeSelector->Update();
294 if (input->GetTimeGeometry()->IsValidTimeStep(t))
296 const mitk::TimeBounds &timebounds = input->GetTimeGeometry()->GetTimeBounds(t);
298 << std::setprecision(0) << timebounds[1] <<
"_T" << t <<
m_Extension;
302 itkWarningMacro(<<
"Error on write: TimeGeometry invalid of image " << filename.str() <<
".");
307 writeVti(filename.str().c_str(), input, t);
369 this->ProcessObject::SetNthInput(0, dynamic_cast<mitk::Image *>(input->
GetData()));
379 std::vector<std::string> possibleFileExtensions;
380 possibleFileExtensions.push_back(
".pic");
381 possibleFileExtensions.push_back(
".pic.gz");
382 possibleFileExtensions.push_back(
".bmp");
383 possibleFileExtensions.push_back(
".dcm");
384 possibleFileExtensions.push_back(
".DCM");
385 possibleFileExtensions.push_back(
".dicom");
386 possibleFileExtensions.push_back(
".DICOM");
387 possibleFileExtensions.push_back(
".gipl");
388 possibleFileExtensions.push_back(
".gipl.gz");
389 possibleFileExtensions.push_back(
".mha");
390 possibleFileExtensions.push_back(
".nii");
391 possibleFileExtensions.push_back(
".nii.gz");
392 possibleFileExtensions.push_back(
".nrrd");
393 possibleFileExtensions.push_back(
".nhdr");
394 possibleFileExtensions.push_back(
".png");
395 possibleFileExtensions.push_back(
".PNG");
396 possibleFileExtensions.push_back(
".spr");
397 possibleFileExtensions.push_back(
".mhd");
398 possibleFileExtensions.push_back(
".vtk");
399 possibleFileExtensions.push_back(
".vti");
400 possibleFileExtensions.push_back(
".hdr");
401 possibleFileExtensions.push_back(
".img");
402 possibleFileExtensions.push_back(
".img.gz");
403 possibleFileExtensions.push_back(
".png");
404 possibleFileExtensions.push_back(
".tif");
405 possibleFileExtensions.push_back(
".jpg");
406 return possibleFileExtensions;
421 this->ProcessObject::SetNthInput(0, image);
426 if (this->GetNumberOfInputs() < 1)
432 return static_cast<const mitk::Image *
>(this->ProcessObject::GetInput(0));
443 return "Nearly Raw Raster Data (*.nrrd);;" 444 "NIfTI format (*.nii *.nii.gz);;" 445 "VTK Image Data Files (*.vti);;" 446 "NRRD with detached header (*.nhdr);;" 447 "Analyze Format (*.hdr);;" 448 "MetaImage (*.mhd);;" 449 "Sets of 2D slices (*.png *.tiff *.jpg *.jpeg *.bmp);;" 450 "DICOM (*.dcm *.DCM *.dicom *.DICOM);;" 451 "UMDS GIPL Format Files (*.gipl *.gipl.gz)";
461 return dynamic_cast<mitk::Image *
>(data.GetPointer());
468 this->
SetInput(dynamic_cast<mitk::Image *>(data.GetPointer()));
void SetDefaultExtension()
Set the extension to be added to the filename to the default.
itk::FixedArray< ScalarType, 2 > TimeBounds
Standard typedef for time-bounds.
const mitk::PixelType GetPixelType(int n=0) const
Returns the PixelType of channel n.
vcl_size_t GetNumberOfComponents() const
Get the number of components of which each element consists.
unsigned int * GetDimensions() const
Get the sizes of all dimensions as an integer-array.
#define MITK_ACCESSBYITK_PIXEL_TYPES_SEQ
const mitk::Image * GetInput()
static void Update(vtkPolyData *)
std::string GetSupportedBaseData() const override
virtual void WriteByITK(mitk::Image *image, const std::string &fileName)
virtual vtkImageData * GetVtkImageData(int t=0, int n=0)
Get a volume at a specific time t of channel n as a vtkImageData.
static void writeVti(const char *filename, mitk::Image *image, int t=0)
std::vector< std::string > GetPossibleFileExtensions() override
Return the possible file extensions for the data type associated with the writer. ...
std::string GetWritenMIMEType() override
Return the MimeType of the saved File.
#define AccessByItk_1(mitkImage, itkImageTypeFunction, arg1)
static const int PixelComponentUserType
void SetFileName(const char *fileName) override
#define AccessFixedPixelTypeByItk_1(mitkImage, itkImageTypeFunction, pixelTypeSeq, arg1)
void DoWrite(BaseData::Pointer data) override
int GetComponentType() const
Get the component type (the scalar (!) type). Each element may contain m_NumberOfComponents (more tha...
static const char * GetStaticNameOfClass()
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
unsigned int GetDimension() const
Get dimension of the image.
Convenience class to temporarily change the current locale.
bool CanWriteBaseDataType(BaseData::Pointer data) override
bool CanWriteDataType(DataNode *) override
Check if the Writer can write the Content of the.
const char * GetFileDialogPattern() override
void GenerateData() override
Image class for storing images.
const char * GetDefaultExtension() override
itk::ImageIOBase::IOPixelType GetPixelType() const
mitk::Image::Pointer image
const Point3D GetOrigin() const
Get the origin, e.g. the upper-left corner of the plane.
const mitk::Vector3D GetSpacing() const
Get the spacing (size of a pixel).
void SetInput(mitk::Image *input)
const RegionType & GetLargestPossibleRegion() const
void _mitkItkPictureWriteComposite(itk::Image< TPixel, VImageDimension > *itkImage, const std::string &fileName)
ITK-Like method to be called for writing an image.
void SetUseCompression(bool useCompression)
void _mitkItkPictureWrite(itk::Image< TPixel, VImageDimension > *itkImage, const std::string &fileName)
ITK-Like method to be called for writing an single-component image using the AccessByItk Macros...
virtual void SetExtension(const char *extension)
Explicitly set the extension to be added to the filename.
std::string m_FileNameWithoutExtension
ImageReadAccessor class to get locked read access for a particular image part.
mitk::BaseGeometry * GetGeometry(int t=0) const
Return the geometry, which is a TimeGeometry, of the data as non-const pointer.
const char * GetDefaultFilename() override
const void * GetData() const
Gives const access to the data.
Class for nodes of the DataTree.
Class for defining the data type of pixels.
mitk::AffineTransform3D * GetIndexToWorldTransform()
Get the transformation used to convert from index to world coordinates.
#define MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES_SEQ
std::string GetFileExtension() override
Return the extension to be added to the filename.