]> Creatis software - gdcm.git/blob - Testing/VTKTestWriteSeq.cxx
* Activate Debug mode
[gdcm.git] / Testing / VTKTestWriteSeq.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: VTKTestWriteSeq.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/02/13 12:06:29 $
7   Version:   $Revision: 1.2 $
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 "vtkGdcmReader.h"
19 #include "vtkGdcmWriter.h"
20 #include "vtkImageViewer.h"
21 #include "vtkImageData.h"
22 #include "vtkRegressionTestImage.h"
23 #include "vtkImageClip.h"
24 #include "vtkImageTranslateExtent.h"
25 #include "vtkImageAppendComponents.h"
26 #include "vtkImageShiftScale.h"
27
28 #include <iostream>
29
30 //Generated file:
31 #include "gdcmDataSeqImages.h"
32 #include "gdcmDebug.h"
33
34 #ifndef vtkFloatingPointType
35 #define vtkFloatingPointType float
36 #endif
37
38 int VTKWriteSeqTest(vtkTesting *t, vtkImageViewer *viewer,
39                    std::string const &filename, 
40                    std::string const &referenceFileName)
41 {
42    int retVal = 0;  //by default this is an error
43
44    // Set the reader   
45    vtkGdcmReader *reader = vtkGdcmReader::New();
46
47    char *newFileDcm = new char[filename.size()+1];
48    int fileCount = 0;
49    for(int i=0;i<9;i++)
50    {
51       fileCount = i;
52       sprintf(newFileDcm,filename.c_str(),i);
53
54       // Test the existance of the file
55       ifstream opened(newFileDcm,std::ios::in | std::ios::binary);
56       if(opened)
57       {
58          reader->AddFileName(newFileDcm);
59          opened.close();
60       }
61       else
62          break;
63    }
64    delete[] newFileDcm;
65    reader->Update();
66
67    // Write the image
68    vtkGdcmWriter *writer = vtkGdcmWriter::New();
69    writer->SetFilePattern("%s%02d.dcm");
70    writer->SetFilePrefix("TestWrite");
71    writer->SetFileDimensionality(2);
72    writer->SetInput(reader->GetOutput());
73    writer->Write();
74
75    reader->Delete();
76    writer->Delete();
77
78    // Reread the image
79    reader = vtkGdcmReader::New();
80    reader->SetFilePattern("%s%02d.dcm");
81    reader->SetFilePrefix("TestWrite");
82    reader->SetFileNameSliceOffset(0);
83    reader->SetFileNameSliceSpacing(1);
84    reader->SetDataExtent(0,0,0,0,0,fileCount-1);
85    reader->Update();
86
87    double range[2];
88    reader->GetOutput()->GetScalarRange(range);
89
90    // Show
91    if( viewer )
92    {
93       viewer->SetInput ( reader->GetOutput() );
94       viewer->OffScreenRenderingOff();
95
96       viewer->SetColorWindow (range[1] - range[0]);
97       viewer->SetColorLevel (0.5 * (range[1] + range[0]));
98
99       int dim[3];
100       reader->GetOutput()->GetDimensions( dim );
101       viewer->SetSize(dim[0], dim[1]);
102       viewer->SetZSlice( 0 );
103       viewer->Render();
104       viewer->SetInput(NULL);
105    }
106
107    // make test
108    int ret = 0;
109    ostrstream str;
110    char *newFilePng = new char[referenceFileName.size()+1];
111    for(int j=0;j<fileCount;j++)
112    {
113       sprintf(newFilePng,referenceFileName.c_str(),j);
114
115       t->CleanArguments();
116       t->AddArgument("-D");
117       t->AddArgument( GDCM_DATA_ROOT );
118       t->AddArgument("-V");
119       t->AddArgument( newFilePng );
120       t->AddArgument("-T");
121       t->AddArgument( "." );
122
123       //----------------------------------------------------------------------
124       // Transform the image to be RGB unsigned char, due to the requests in
125       // vtkTesting processing
126       // The pipeline is broken after each process to keep maximum of memory
127       vtkImageData *image=reader->GetOutput();
128       image->Update();
129       image->Register(NULL);
130
131       // Get the middle slice in the image
132       int *ext=image->GetExtent();
133       vtkImageClip *clip=vtkImageClip::New();
134       clip->SetInput(image);
135       clip->SetOutputWholeExtent(ext[0],ext[1],ext[2],ext[3],j,j);
136       clip->ClipDataOn();
137       vtkImageTranslateExtent *translat=vtkImageTranslateExtent::New();
138       translat->SetInput(clip->GetOutput());
139       translat->SetTranslation(0,0,-j);
140
141       image->UnRegister(NULL);
142       image=translat->GetOutput();
143       image->Update();
144       image->Register(NULL);
145       translat->SetOutput(NULL);
146       clip->Delete();
147       translat->Delete();
148
149       // Set an unsigned char image
150       // Shift/Scale the image 
151       image->Update();
152       vtkImageShiftScale *iss=vtkImageShiftScale::New();
153       iss->SetInput(image);
154       iss->SetOutputScalarTypeToUnsignedChar();
155       iss->SetShift(-range[0]);
156       iss->SetScale(255.0/(range[1]-range[0]));
157       iss->ClampOverflowOn();
158
159       image->UnRegister(NULL);
160       image=iss->GetOutput();
161       image->Update();
162       image->Register(NULL);
163       iss->Delete();
164
165       // Set 3 components to the image
166       if(image->GetNumberOfScalarComponents()==1)
167       {
168          vtkImageAppendComponents *x3=vtkImageAppendComponents::New();
169          x3->AddInput(image);
170          x3->AddInput(image);
171          x3->AddInput(image);
172
173          image->UnRegister(NULL);
174          image=x3->GetOutput();
175          image->Update();
176          image->Register(NULL);
177          x3->SetOutput(NULL);
178          x3->Delete();
179       }
180       // End of transform
181       //----------------------------------------------------------------------
182
183       // make test
184       retVal = t->RegressionTest(image,2.0,str);
185       image->UnRegister(NULL);
186
187       if( retVal != vtkTesting::PASSED )
188       {
189          std::cerr << str.str();
190       }
191       str.rdbuf()->freeze(1);
192
193       if( retVal == vtkTesting::PASSED )
194       {
195          std::cerr << "       ...Slice " << j << ": OK" << std::endl;
196       }
197       else
198       {
199          std::cerr << "       ...Slice " << j << ": Failed" << std::endl;
200          ret++;
201       }
202    }
203
204    delete[] newFilePng;
205    reader->Delete();
206
207    return ret;
208 }
209
210 int VTKTestWriteSeq(int argc, char *argv[])
211 {
212    bool show = false;
213    if( argc >= 2 )
214    {
215       if( std::string(argv[1]) == "-V" )
216       {
217          show = true;
218       }
219    }
220
221    gdcm::Debug::DebugOn();
222
223    int ret = 0;
224    vtkTesting *t = vtkTesting::New();
225    vtkImageViewer *viewer;
226    if( show )
227       viewer = vtkImageViewer::New();
228    else
229       viewer = NULL;
230
231    if( argc < 3+show )
232    {
233       std::cerr << "Usage: " << argv[0] << " [-V] image%d.dcm ref%d.png\n";
234       std::cerr << "   -V : to view images to the screen... \n"
235                 << "        this mode can generate errors in the test\n";
236       std::cerr << "   %d : this will be replaced by a number at execution.\n"
237                 << "        It will be from 0 to 9 only with a step of 1\n\n";
238    }
239    else
240    {
241       ret = VTKWriteSeqTest(t,viewer,argv[1+show],argv[2+show]);
242       t->Delete();
243       if( viewer )
244          viewer->Delete();
245
246       return ret;
247    }
248
249    // Test for all images
250    int i = 0;
251    while( gdcmDataSeqImages[i] != 0 )
252    {
253       std::string filename = GDCM_DATA_ROOT;
254       filename += "/";  //doh!
255       filename += gdcmDataSeqImages[i];
256       std::cerr << "Filename: " << filename << std::endl;
257
258       //Extract name to find the png file matching:
259       std::string pngfile = gdcmDataSeqImages[i++];
260       std::string::size_type dot_pos = pngfile.rfind( "." );
261       pngfile = pngfile.substr(0, dot_pos).append( ".png" );
262       pngfile.insert( 0, "Baseline/");
263       
264       ret += VTKWriteSeqTest(t,viewer,filename,pngfile);
265    }
266    t->Delete();
267    if( viewer )
268       viewer->Delete();
269
270    return ret;
271 }