--- /dev/null
+/*=========================================================================
+
+ Program: gdcm
+ Module: $RCSfile: VTKTestWriteSeq.cxx,v $
+ Language: C++
+ Date: $Date: 2005/02/09 15:31:15 $
+ Version: $Revision: 1.1 $
+
+ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+ l'Image). All rights reserved. See Doc/License.txt or
+ http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#include "vtkGdcmReader.h"
+#include "vtkGdcmWriter.h"
+#include "vtkImageViewer.h"
+#include "vtkImageData.h"
+#include "vtkRegressionTestImage.h"
+#include "vtkImageClip.h"
+#include "vtkImageTranslateExtent.h"
+#include "vtkImageAppendComponents.h"
+#include "vtkImageShiftScale.h"
+
+#include <iostream>
+
+//Generated file:
+#include "gdcmDataSeqImages.h"
+
+#ifndef vtkFloatingPointType
+#define vtkFloatingPointType float
+#endif
+
+int VTKWriteSeqTest(vtkTesting *t, vtkImageViewer *viewer,
+ std::string const &filename,
+ std::string const &referenceFileName)
+{
+ int retVal = 0; //by default this is an error
+
+ // Set the reader
+ vtkGdcmReader *reader = vtkGdcmReader::New();
+
+ char *newFileDcm = new char[filename.size()+1];
+ int fileCount = 0;
+ for(int i=0;i<9;i++)
+ {
+ fileCount = i;
+ sprintf(newFileDcm,filename.c_str(),i);
+
+ // Test the existance of the file
+ ifstream opened(newFileDcm,std::ios::in | std::ios::binary);
+ if(opened)
+ {
+ reader->AddFileName(newFileDcm);
+ opened.close();
+ }
+ else
+ break;
+ }
+ delete[] newFileDcm;
+ reader->Update();
+
+ // Write the image
+ vtkGdcmWriter *writer = vtkGdcmWriter::New();
+ writer->SetFilePattern("%s%02d.dcm");
+ writer->SetFilePrefix("TestWrite");
+ writer->SetFileDimensionality(2);
+ writer->SetInput(reader->GetOutput());
+ writer->Write();
+
+ reader->Delete();
+ writer->Delete();
+
+ // Reread the image
+ reader = vtkGdcmReader::New();
+ reader->SetFilePattern("%s%02d.dcm");
+ reader->SetFilePrefix("TestWrite");
+ reader->SetFileNameSliceOffset(0);
+ reader->SetFileNameSliceSpacing(1);
+ reader->SetDataExtent(0,0,0,0,0,fileCount-1);
+ reader->Update();
+
+ double range[2];
+ reader->GetOutput()->GetScalarRange(range);
+
+ // Show
+ if( viewer )
+ {
+ viewer->SetInput ( reader->GetOutput() );
+ viewer->OffScreenRenderingOff();
+
+ viewer->SetColorWindow (range[1] - range[0]);
+ viewer->SetColorLevel (0.5 * (range[1] + range[0]));
+
+ int dim[3];
+ reader->GetOutput()->GetDimensions( dim );
+ viewer->SetSize(dim[0], dim[1]);
+ viewer->SetZSlice( 0 );
+ viewer->Render();
+ viewer->SetInput(NULL);
+ }
+
+ // make test
+ int ret = 0;
+ ostrstream str;
+ char *newFilePng = new char[referenceFileName.size()+1];
+ for(int j=0;j<fileCount;j++)
+ {
+ sprintf(newFilePng,referenceFileName.c_str(),j);
+
+ t->CleanArguments();
+ t->AddArgument("-D");
+ t->AddArgument( GDCM_DATA_ROOT );
+ t->AddArgument("-V");
+ t->AddArgument( newFilePng );
+ t->AddArgument("-T");
+ t->AddArgument( "." );
+
+ //----------------------------------------------------------------------
+ // Transform the image to be RGB unsigned char, due to the requests in
+ // vtkTesting processing
+ // The pipeline is broken after each process to keep maximum of memory
+ vtkImageData *image=reader->GetOutput();
+ image->Update();
+ image->Register(NULL);
+
+ // Get the middle slice in the image
+ int *ext=image->GetExtent();
+ vtkImageClip *clip=vtkImageClip::New();
+ clip->SetInput(image);
+ clip->SetOutputWholeExtent(ext[0],ext[1],ext[2],ext[3],j,j);
+ clip->ClipDataOn();
+ vtkImageTranslateExtent *translat=vtkImageTranslateExtent::New();
+ translat->SetInput(clip->GetOutput());
+ translat->SetTranslation(0,0,-j);
+
+ image->UnRegister(NULL);
+ image=translat->GetOutput();
+ image->Update();
+ image->Register(NULL);
+ translat->SetOutput(NULL);
+ clip->Delete();
+ translat->Delete();
+
+ // Set an unsigned char image
+ // Shift/Scale the image
+ image->Update();
+ vtkImageShiftScale *iss=vtkImageShiftScale::New();
+ iss->SetInput(image);
+ iss->SetOutputScalarTypeToUnsignedChar();
+ iss->SetShift(-range[0]);
+ iss->SetScale(255.0/(range[1]-range[0]));
+ iss->ClampOverflowOn();
+
+ image->UnRegister(NULL);
+ image=iss->GetOutput();
+ image->Update();
+ image->Register(NULL);
+ iss->Delete();
+
+ // Set 3 components to the image
+ if(image->GetNumberOfScalarComponents()==1)
+ {
+ vtkImageAppendComponents *x3=vtkImageAppendComponents::New();
+ x3->AddInput(image);
+ x3->AddInput(image);
+ x3->AddInput(image);
+
+ image->UnRegister(NULL);
+ image=x3->GetOutput();
+ image->Update();
+ image->Register(NULL);
+ x3->SetOutput(NULL);
+ x3->Delete();
+ }
+ // End of transform
+ //----------------------------------------------------------------------
+
+ // make test
+ retVal = t->RegressionTest(image,2.0,str);
+ image->UnRegister(NULL);
+
+ if( retVal != vtkTesting::PASSED )
+ {
+ std::cerr << str.str();
+ }
+ str.rdbuf()->freeze(1);
+
+ if( retVal == vtkTesting::PASSED )
+ {
+ std::cerr << " ...Slice " << j << ": OK" << std::endl;
+ }
+ else
+ {
+ std::cerr << " ...Slice " << j << ": Failed" << std::endl;
+ ret++;
+ }
+ }
+
+ delete[] newFilePng;
+ reader->Delete();
+
+ return ret;
+}
+
+int VTKTestWriteSeq(int argc, char *argv[])
+{
+ bool show = false;
+ if( argc >= 2 )
+ {
+ if( std::string(argv[1]) == "-V" )
+ {
+ show = true;
+ }
+ }
+
+ int ret = 0;
+ vtkTesting *t = vtkTesting::New();
+ vtkImageViewer *viewer;
+ if( show )
+ viewer = vtkImageViewer::New();
+ else
+ viewer = NULL;
+
+ if( argc < 3+show )
+ {
+ std::cerr << "Usage: " << argv[0] << " [-V] image%d.dcm ref%d.png\n";
+ std::cerr << " -V : to view images to the screen... \n"
+ << " this mode can generate errors in the test\n";
+ std::cerr << " %d : this will be replaced by a number at execution.\n"
+ << " It will be from 0 to 9 only with a step of 1\n\n";
+ }
+ else
+ {
+ ret = VTKWriteSeqTest(t,viewer,argv[1+show],argv[2+show]);
+ t->Delete();
+ if( viewer )
+ viewer->Delete();
+
+ return ret;
+ }
+
+ // Test for all images
+ int i = 0;
+ while( gdcmDataSeqImages[i] != 0 )
+ {
+ std::string filename = GDCM_DATA_ROOT;
+ filename += "/"; //doh!
+ filename += gdcmDataSeqImages[i];
+ std::cerr << "Filename: " << filename << std::endl;
+
+ //Extract name to find the png file matching:
+ std::string pngfile = gdcmDataSeqImages[i++];
+ std::string::size_type dot_pos = pngfile.rfind( "." );
+ pngfile = pngfile.substr(0, dot_pos).append( ".png" );
+ pngfile.insert( 0, "Baseline/");
+
+ ret += VTKWriteSeqTest(t,viewer,filename,pngfile);
+ }
+ t->Delete();
+ if( viewer )
+ viewer->Delete();
+
+ return ret;
+}