]> Creatis software - clitk.git/blob - common/vvImageWriter.txx
Merge /home/srit/src/clitk/clitk
[clitk.git] / common / vvImageWriter.txx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef vvImageWriter_TXX
19 #define vvImageWriter_TXX
20
21 #include <itkImageFileWriter.h>
22 #include <itkChangeInformationImageFilter.h>
23 #include "vvToITK.h"
24
25 //====================================================================
26 template<unsigned int VImageDimension>
27 void vvImageWriter::UpdateWithDim(std::string OutputPixelType)
28 {
29   if (OutputPixelType == "short") {
30     UpdateWithDimAndOutputPixelType<short,VImageDimension>();
31   } else if (OutputPixelType == "unsigned short") {
32     UpdateWithDimAndOutputPixelType<unsigned short,VImageDimension>();
33   } else if (OutputPixelType == "unsigned_short") {
34     UpdateWithDimAndOutputPixelType<unsigned short,VImageDimension>();
35   } else if (OutputPixelType == "char") {
36     UpdateWithDimAndOutputPixelType<char,VImageDimension>();
37   } else if (OutputPixelType == "unsigned_char") {
38     UpdateWithDimAndOutputPixelType<unsigned char,VImageDimension>();
39   } else if (OutputPixelType == "int") {
40     UpdateWithDimAndOutputPixelType<int,VImageDimension>();
41   } else if (OutputPixelType == "double") {
42     UpdateWithDimAndOutputPixelType<double,VImageDimension>();
43   } else if (OutputPixelType == "float") {
44     UpdateWithDimAndOutputPixelType<float,VImageDimension>();
45   } else {
46     std::cerr << "Error, output pixel type : \"" << OutputPixelType << "\" unknown !" << std::endl;
47   }
48 }
49 //====================================================================
50
51 //====================================================================
52 template<class OutputPixelType, unsigned int VImageDimension>
53 void vvImageWriter::UpdateWithDimAndOutputPixelType()
54 {
55   // The ITK image
56   typedef itk::Image< OutputPixelType, VImageDimension > OutputImageType;
57   typename OutputImageType::ConstPointer itkimg = vvImageToITK<OutputImageType>(mImage);
58
59   //Create the writer
60   typedef itk::ImageFileWriter<OutputImageType> WriterType;
61   typename WriterType::Pointer writer = WriterType::New();
62   writer->SetFileName(mOutputFilename);
63
64   //Change information if it must transformation must be saved
65   typedef itk::ChangeInformationImageFilter<OutputImageType> ChangeInfoType;
66   typename ChangeInfoType::Pointer info = ChangeInfoType::New();
67   if(mSaveTransform) {
68     // Set pipeline
69     info->SetInput(itkimg);
70     writer->SetInput(info->GetOutput());
71
72     // Inverse vv matrix
73     itk::Matrix<double, 4, 4> trans;
74     for(int i=0; i<4; i++)
75       for(int j=0; j<4; j++)
76         // TODO SR and BP: check on the list of transforms and not the first only
77         trans[i][j] = mImage->GetTransform()[0]->GetMatrix()->GetElement(i,j);
78     trans = trans.GetInverse();
79
80     // Direction
81     typename ChangeInfoType::DirectionType direction;
82     for(unsigned int i=0; i<VImageDimension; i++)
83       for(unsigned int j=0; j<VImageDimension; j++)
84         direction[i][j] = trans[i][j];
85     info->SetOutputDirection(direction);
86     info->ChangeDirectionOn();
87
88     // Origin
89     typename ChangeInfoType::PointType origin = itkimg->GetOrigin();
90     origin = direction * origin;
91     for(unsigned int i=0; i<VImageDimension; i++)
92       origin[i] += trans[i][3];
93     info->SetOutputOrigin(origin);
94     info->ChangeOriginOn();
95   }
96   else
97     writer->SetInput(itkimg);
98
99
100   if (mUseAnObserver) {
101     writer->AddObserver(itk::ProgressEvent(), mObserver);
102   }
103   try {
104     writer->Update();
105   } catch ( itk::ExceptionObject & err ) {
106     std::cerr << "Error while reading " << mOutputFilename.c_str()
107               << " " << err << std::endl;
108     std::stringstream error;
109     error << err;
110     mLastError = error.str();
111     return;
112   }
113 }
114 //====================================================================
115
116 #endif /* end #define vvImageWriter_TXX */
117