]> Creatis software - cpPlugins.git/blob - plugins/IO/ImageWriter.cxx
94a822bd2ab1d8f781f85779759558225215658f
[cpPlugins.git] / plugins / IO / ImageWriter.cxx
1 #include <IO/ImageWriter.h>
2 #include <IO/ImageWriterQDialog.h>
3 #include <cpPlugins/DataObjects/Image.h>
4 #include <cpPlugins/DataObjects/Image_Demanglers.h>
5 #include <cpInstances_SimpleImages.h>
6
7 #include <itkImageFileWriter.h>
8
9 #ifdef cpPlugins_QT4
10
11 #include <QApplication>
12 #include <QFileInfo>
13
14 // -------------------------------------------------------------------------
15 cpPluginsIO::ImageWriterQDialog::
16 ImageWriterQDialog( QWidget* parent )
17   : QFileDialog( parent ),
18     m_ProcessObject( NULL )
19 {
20   this->connect(
21     this, SIGNAL( accepted( ) ), this, SLOT( _dlg_Accepted( ) )
22     );
23   this->setWindowTitle( "Save an image" );
24 }
25
26 // -------------------------------------------------------------------------
27 cpPluginsIO::ImageWriterQDialog::
28 ~ImageWriterQDialog( )
29 {
30 }
31
32 // -------------------------------------------------------------------------
33 void cpPluginsIO::ImageWriterQDialog::
34 setProcessObject( cpPlugins::BaseObjects::ProcessObject* obj )
35 {
36   if( obj == NULL )
37     return;
38   this->m_ProcessObject = obj;
39   auto parameters = this->m_ProcessObject->GetParameters( );
40   auto extensions = parameters->GetAcceptedFileExtensions( "FileName" );
41   auto filename = parameters->GetSaveFileName( "FileName" );
42
43   QStringList filters;
44   if( extensions != "" )
45     filters << extensions.c_str( );
46   filters << "Any file (*)";
47   this->setFileMode( QFileDialog::AnyFile );
48   this->setNameFilters( filters );
49   this->setAcceptMode( QFileDialog::AcceptSave );
50   if( filename != "" )
51   {
52     QFileInfo info( filename.c_str( ) );
53     if( info.exists( ) )
54       this->setDirectory( info.canonicalPath( ) );
55     else
56       this->setDirectory( "." );
57   }
58   else
59     this->setDirectory( "." );
60 }
61
62 // -------------------------------------------------------------------------
63 void cpPluginsIO::ImageWriterQDialog::
64 _dlg_Accepted( )
65 {
66   if( this->m_ProcessObject != NULL )
67   {
68     auto param = this->m_ProcessObject->GetParameters( );
69     auto files = this->selectedFiles( );
70     if( files.size( ) > 0 )
71       param->SetSaveFileName( "FileName", files.begin( )->toStdString( ) );
72
73   } // fi
74 }
75
76 #endif // cpPlugins_QT4
77
78 // -------------------------------------------------------------------------
79 QDialog* cpPluginsIO::ImageWriter::
80 CreateQDialog( )
81 {
82 #ifdef cpPlugins_QT4
83   ImageWriterQDialog* dlg = NULL;
84   if( QApplication::instance( ) != NULL )
85   {
86     dlg = new ImageWriterQDialog( );
87     dlg->setProcessObject( this );
88
89   } // fi
90   return( dlg );
91 #else // cpPlugins_QT4
92   return( NULL );
93 #endif // cpPlugins_QT4
94 }
95
96 // -------------------------------------------------------------------------
97 cpPluginsIO::ImageWriter::
98 ImageWriter( )
99   : Superclass( )
100 {
101   this->_ConfigureInput< cpPlugins::DataObjects::Image >( "Input", true, false );
102   this->m_Parameters.Clear( );
103   this->m_Parameters.ConfigureAsSaveFileName( "FileName" );
104   this->m_Parameters.SetAcceptedFileExtensions(
105     "FileName",
106     "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
107     );
108 }
109
110 // -------------------------------------------------------------------------
111 cpPluginsIO::ImageWriter::
112 ~ImageWriter( )
113 {
114 }
115
116 // -------------------------------------------------------------------------
117 void cpPluginsIO::ImageWriter::
118 _GenerateData( )
119 {
120   auto o = this->GetInputData( "Input" );
121   cpPlugins_Demangle_Image_ProcessDims( o, _GD0, )
122     cpPlugins_Demangle_Image_DiffTensors3D( o, _GD1, )
123     this->_Error( "Invalid input image dimension." );
124 }
125
126 // -------------------------------------------------------------------------
127 template< class _TImage >
128 void cpPluginsIO::ImageWriter::
129 _GD0( _TImage* image )
130 {
131   cpPlugins_Demangle_Image_ScalarPixels( image, _GD1, _TImage::ImageDimension, )
132     cpPlugins_Demangle_Image_ComplexPixels( image, _GD1, _TImage::ImageDimension, )
133     cpPlugins_Demangle_Image_ColorPixels( image, _GD1, _TImage::ImageDimension, )
134     cpPlugins_Demangle_Image_VectorPixels( image, _GD1, _TImage::ImageDimension, )
135     this->_Error( "Invalid input image pixel type." );
136 }
137
138 // -------------------------------------------------------------------------
139 template< class _TImage >
140 void cpPluginsIO::ImageWriter::
141 _GD1( _TImage* image )
142 {
143   typedef itk::ImageFileWriter< _TImage > _TFilter;
144
145   auto f = this->_CreateITK< _TFilter >( );
146   f->SetFileName( this->m_Parameters.GetSaveFileName( "FileName" ) );
147   f->SetInput( image );
148   try
149   {
150     f->Update( );
151   }
152   catch( itk::ExceptionObject& err )
153   {
154     this->_Error( err.GetDescription( ) );
155
156   } // yrt
157 }
158
159 // eof - $RCSfile$