]> Creatis software - gdcm.git/blob - Testing/VTKTestWrite.cxx
* Test/VTKTest*.cxx : bug fix... tests don't generate VTK warning concerning
[gdcm.git] / Testing / VTKTestWrite.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: VTKTestWrite.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/01/19 13:50:11 $
7   Version:   $Revision: 1.3 $
8
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 #include "gdcmFile.h"
19 #include "vtkGdcmReader.h"
20 #include "vtkGdcmWriter.h"
21 #include "vtkImageViewer.h"
22 #include "vtkImageData.h"
23 #include "vtkRegressionTestImage.h"
24 #include "vtkImageClip.h"
25 #include "vtkImageTranslateExtent.h"
26 #include "vtkImageAppendComponents.h"
27 #include "vtkImageShiftScale.h"
28
29 #include <iostream>
30
31 //Generated file:
32 #include "gdcmDataImages.h"
33
34 #ifndef vtkFloatingPointType
35 #define vtkFloatingPointType float
36 #endif
37
38 int VTKWriteTest(vtkTesting *t,vtkImageViewer *viewer,
39                  std::string const & filename, 
40                  std::string const & referenceFileName,
41                  bool show )
42 {
43    int retVal = 0;  //by default this is an error
44
45    t->CleanArguments();
46    t->AddArgument("-D");
47    t->AddArgument( GDCM_DATA_ROOT );
48    t->AddArgument("-V");
49    t->AddArgument( referenceFileName.c_str() );
50    t->AddArgument("-T");
51    t->AddArgument( "." );
52
53    // Read the image   
54    vtkGdcmReader *origin = vtkGdcmReader::New();
55    origin->SetFileName( filename.c_str() );
56    origin->Update();
57
58    // Write the image
59    vtkGdcmWriter *writer = vtkGdcmWriter::New();
60    writer->SetFileName( "TestWrite.dcm" );
61    writer->SetInput(origin->GetOutput());
62    writer->Write();
63
64    origin->Delete();
65    writer->Delete();
66
67    // Read the written image   
68    vtkGdcmReader *reader = vtkGdcmReader::New();
69    reader->SetFileName( "TestWrite.dcm" );
70    reader->Update();
71
72    int dim[3];
73    reader->GetOutput()->GetDimensions( dim );
74
75    // Show
76    if( show )
77    {
78       viewer->SetInput ( reader->GetOutput() );
79
80       vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
81       viewer->SetColorWindow (range[1] - range[0]);
82       viewer->SetColorLevel (0.5 * (range[1] + range[0]));
83
84       viewer->SetSize(dim[0], dim[1]);
85       if(dim[2] != 1)
86       {
87          //For multifame dicom, take a snapshot of the center slice (+/- 1)
88          viewer->SetZSlice( dim[2] / 2 );
89       }
90       else
91       {
92          viewer->SetZSlice( 0 );
93       }
94
95       viewer->OffScreenRenderingOff();
96       viewer->Render();
97       viewer->SetInput(NULL);
98    }
99
100    //----------------------------------------------------------------------
101    // Transform the image to be RGB unsigned char, due to the requests in
102    // vtkTesting processing
103    // The pipeline is broken after each process to keep maximum of memory
104    vtkImageData *image=reader->GetOutput();
105    image->Update();
106    image->Register(NULL);
107    reader->Delete();
108
109    // Get the middle slice in the image
110    if(dim[2] != 1)
111    {
112       int *ext=image->GetExtent();
113       vtkImageClip *clip=vtkImageClip::New();
114       clip->SetInput(image);
115       clip->SetOutputWholeExtent(ext[0],ext[1],ext[2],ext[3],
116                                  ext[4]+dim[2] / 2,ext[4]+dim[2] / 2);
117       clip->ClipDataOn();
118       vtkImageTranslateExtent *translat=vtkImageTranslateExtent::New();
119       translat->SetInput(clip->GetOutput());
120       translat->SetTranslation(0,0,-ext[4]-dim[2] / 2);
121
122       image->UnRegister(NULL);
123       image=translat->GetOutput();
124       image->Update();
125       image->Register(NULL);
126       translat->SetOutput(NULL);
127       clip->Delete();
128       translat->Delete();
129    }
130
131    // Set an unsigned char image
132    // Shift/Scale the image 
133    image->Update();
134    double *rng=image->GetScalarRange();
135    vtkImageShiftScale *iss=vtkImageShiftScale::New();
136    iss->SetInput(image);
137    iss->SetOutputScalarTypeToUnsignedChar();
138    iss->SetShift(-rng[0]);
139    iss->SetScale(255.0/(rng[1]-rng[0]));
140    iss->ClampOverflowOn();
141
142    image->UnRegister(NULL);
143    image=iss->GetOutput();
144    image->Update();
145    image->Register(NULL);
146    iss->Delete();
147
148    // Set 3 components to the image
149    if(image->GetNumberOfScalarComponents()==1)
150    {
151       vtkImageAppendComponents *x3=vtkImageAppendComponents::New();
152       x3->AddInput(image);
153       x3->AddInput(image);
154       x3->AddInput(image);
155
156       image->UnRegister(NULL);
157       image=x3->GetOutput();
158       image->Update();
159       image->Register(NULL);
160       x3->SetOutput(NULL);
161       x3->Delete();
162    }
163    // End of transform
164    //----------------------------------------------------------------------
165
166    // make test
167    ostrstream str;
168    retVal = t->RegressionTest(image,0.0,str);
169    image->UnRegister(NULL);
170
171    if( retVal != vtkTesting::PASSED )
172    {
173       std::cerr << str.str();
174    }
175    str.rdbuf()->freeze(1);
176
177    if( retVal == vtkTesting::PASSED )
178    {
179       std::cerr << "       ... OK" << std::endl;
180       return 0;
181    }
182    else
183    {
184       std::cerr << "       ... Failed" << std::endl;
185       return 1;
186    }
187 }
188
189 int VTKTestWrite(int argc, char *argv[])
190 {
191    bool show = false;
192    if( argc >= 2 )
193    {
194       if( std::string(argv[1]) == "-V" )
195       {
196          show = true;
197       }
198    }
199
200    int ret = 0;
201    vtkTesting* t = vtkTesting::New();
202    vtkImageViewer *viewer;
203    if( show )
204       viewer = vtkImageViewer::New();
205    else
206       viewer = NULL;
207
208    if( argc < 3+show )
209    {
210       std::cerr << "Usage: " << argv[0] << " [-V] image.dcm ref.png\n";
211       std::cerr << "   -V : to view images to the screen... \n"
212                 << "        this mode can generate errors in the test\n\n";
213    }
214    else
215    {
216       ret = VTKWriteTest(t,viewer,argv[1+show],argv[2+show],show);
217       t->Delete();
218       if( viewer )
219          viewer->Delete();
220
221       return ret;
222    }
223
224    // Test for all images
225    int i = 0;
226    while( gdcmDataImages[i] != 0 )
227    {
228       std::string filename = GDCM_DATA_ROOT;
229       filename += "/";  //doh!
230       filename += gdcmDataImages[i];
231       std::cerr << "Filename: " << filename << std::endl;
232
233       //Extract name to find the png file matching:
234       std::string pngfile = gdcmDataImages[i++];
235       //pngfile.replace(pngfile.size()-3, 3, "png");
236       //More robust approach:
237       std::string::size_type dot_pos = pngfile.rfind( "." );
238       pngfile = pngfile.substr(0, dot_pos).append( ".png" );
239       pngfile.insert( 0, "Baseline/");
240       //std::cerr << "PNG file: " << pngfile << std::endl;
241
242       ret += VTKWriteTest(t,viewer,filename,pngfile,show);
243    }
244    t->Delete();
245    if( viewer )
246       viewer->Delete();
247
248    return ret;
249 }