#define vvImageWriter_TXX
#include <itkImageFileWriter.h>
+#include <itkChangeInformationImageFilter.h>
#include "vvToITK.h"
-#include "clitkDD.h"
//====================================================================
template<unsigned int VImageDimension>
UpdateWithDimAndOutputPixelType<unsigned char,VImageDimension>();
} else if (OutputPixelType == "int") {
UpdateWithDimAndOutputPixelType<int,VImageDimension>();
+ } else if (OutputPixelType == "unsigned_int") {
+ UpdateWithDimAndOutputPixelType<unsigned int,VImageDimension>();
} else if (OutputPixelType == "double") {
UpdateWithDimAndOutputPixelType<double,VImageDimension>();
} else if (OutputPixelType == "float") {
template<class OutputPixelType, unsigned int VImageDimension>
void vvImageWriter::UpdateWithDimAndOutputPixelType()
{
- //Create the writer
+ // The ITK image
typedef itk::Image< OutputPixelType, VImageDimension > OutputImageType;
+ typename OutputImageType::ConstPointer itkimg = vvImageToITK<OutputImageType>(mImage);
+
+ //Create the writer
typedef itk::ImageFileWriter<OutputImageType> WriterType;
typename WriterType::Pointer writer = WriterType::New();
writer->SetFileName(mOutputFilename);
- writer->SetInput(vvImageToITK<OutputImageType>(mImage));
+
+ //Change information if it must transformation must be saved
+ typedef itk::ChangeInformationImageFilter<OutputImageType> ChangeInfoType;
+ typename ChangeInfoType::Pointer info = ChangeInfoType::New();
+ if(mSaveTransform) {
+ // Set pipeline
+ info->SetInput(itkimg);
+ writer->SetInput(info->GetOutput());
+
+ // Inverse vv matrix
+ itk::Matrix<double, 4, 4> trans;
+ for(int i=0; i<4; i++)
+ for(int j=0; j<4; j++)
+ // TODO SR and BP: check on the list of transforms and not the first only
+ trans[i][j] = mImage->GetTransform()[0]->GetMatrix()->GetElement(i,j);
+ trans = trans.GetInverse();
+
+ // Direction
+ typename ChangeInfoType::DirectionType direction;
+ for(unsigned int i=0; i<VImageDimension; i++)
+ for(unsigned int j=0; j<VImageDimension; j++)
+ direction[i][j] = trans[i][j];
+ info->SetOutputDirection(direction);
+ info->ChangeDirectionOn();
+
+ // Origin
+ typename ChangeInfoType::PointType origin = itkimg->GetOrigin();
+ origin = direction * origin;
+ for(unsigned int i=0; i<VImageDimension; i++)
+ origin[i] += trans[i][3];
+ info->SetOutputOrigin(origin);
+ info->ChangeOriginOn();
+ }
+ else
+ writer->SetInput(itkimg);
+
+
if (mUseAnObserver) {
writer->AddObserver(itk::ProgressEvent(), mObserver);
}