1 // This example illustrates how the vtkGdcmReader vtk class can be
3 // * produce a simple (vtk based) Dicom image STACK VIEWER.
4 // * dump the stack considered as a volume in a vtkStructuredPoints
5 // vtk file: the vtk gdcm wrappers can be seen as a simple way to convert
6 // a stack of Dicom images into a native vtk volume.
9 // * the filenames of the Dicom images constituting the stack should be
10 // given as command line arguments,
11 // * you can navigate through the stack by hitting any character key,
12 // * the produced vtk file is named "foo.vtk" (in the invocation directory).
14 //----------------------------------------------------------------------------
15 #include <vtkRenderWindowInteractor.h>
16 #include <vtkImageViewer.h>
17 #include <vtkStructuredPoints.h>
18 #include <vtkStructuredPointsWriter.h>
19 #include <vtkPNGWriter.h>
20 #include <vtkCommand.h>
21 #include <vtkRenderer.h>
22 #include <vtkImageMapToColors.h>
23 #include <vtkLookupTable.h>
25 #include "vtkGdcmReader.h"
26 #include "gdcmDebug.h"
30 #ifndef vtkFloatingPointType
31 #define vtkFloatingPointType float
34 //----------------------------------------------------------------------------
35 // Callback for the interaction
36 class vtkgdcmObserver : public vtkCommand
39 virtual char const *GetClassName() const
41 return "vtkgdcmObserver";
43 static vtkgdcmObserver *New()
45 return new vtkgdcmObserver;
49 this->ImageViewer = NULL;
51 virtual void Execute(vtkObject *, unsigned long event, void* )
53 if ( this->ImageViewer )
55 if ( event == vtkCommand::CharEvent )
57 int max = ImageViewer->GetWholeZMax();
58 int slice = (ImageViewer->GetZSlice() + 1 ) % ++max;
59 ImageViewer->SetZSlice( slice );
60 ImageViewer->GetRenderer()->ResetCameraClippingRange();
61 ImageViewer->Render();
65 vtkImageViewer *ImageViewer;
69 int main(int argc, char *argv[])
74 gdcm::Debug::SetDebugOff();
75 vtkGdcmReader *reader = vtkGdcmReader::New();
76 reader->AllowLookupTableOff();
79 reader->SetFileName( argv[1] );
81 for(int i=1; i< argc; i++)
82 reader->AddFileName( argv[i] );
87 reader->GetOutput()->Print( cout );
89 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
91 vtkImageViewer *viewer = vtkImageViewer::New();
93 if( reader->GetLookupTable() )
96 vtkImageMapToColors *map = vtkImageMapToColors::New ();
97 map->SetInput (reader->GetOutput());
98 map->SetLookupTable (reader->GetLookupTable());
99 map->SetOutputFormatToRGB();
100 viewer->SetInput ( map->GetOutput() );
105 double *range = reader->GetOutput()->GetScalarRange();
106 viewer->SetColorLevel (0.5 * (range[1] + range[0]));
107 viewer->SetColorWindow (range[1] - range[0]);
109 viewer->SetInput ( reader->GetOutput() );
111 viewer->SetupInteractor (iren);
113 //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
114 //viewer->SetColorWindow (range[1] - range[0]);
115 //viewer->SetColorLevel (0.5 * (range[1] + range[0]));
117 // Here is where we setup the observer,
118 vtkgdcmObserver *obs = vtkgdcmObserver::New();
119 obs->ImageViewer = viewer;
120 iren->AddObserver(vtkCommand::CharEvent,obs);
126 //if you wish you can export dicom to a vtk file
127 //vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
128 vtkPNGWriter *writer = vtkPNGWriter::New();
129 writer->SetInput( reader->GetOutput());
130 writer->SetFileName( "foo.png" );
131 //writer->SetFileTypeToBinary();