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