+2004-11-30 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
+ * Test/ShowDicom.cxx : now can be used with an off-screen rendering to
+ avoid problems (otherwise, the difference test between the visible image
+ and the reference is incorrect. If the reference is greater than the
+ screen resolution, it's produce errors).
+ Can be used for only one image. Can be used with a visible flag.
+ * vtk/vtkGdcmReader.cxx : remove commented codes.
+ * vtk/vtkGdcmReader.h : add the gdcmCommon.h include file to avoid warnings
+ under windows at compilation
+ * vtk/vtkgdcmViewer.cxx : reformat the file. Apply a default window/level
+ for grayscale images
+ * vtk/GdcmToBaseline.cxx : new program to easy create the reference image
+
2004-11-30 Benoit Regrain <Benoit.Regrain@creatis.insa-lyon.fr>
* src/gdcmFile.[h|cxx] : bug fix for ACR-LIBIDO files when writting the file
* Test/TestAllReadCompareDicom.cxx, TestReadWriteReadCompare.cxx : add
vtkRendering
)
+#-----------------------------------------------------------------------------
+SET(GdcmToBaseline_SOURCES
+ GdcmToBaseline.cxx
+)
+ADD_EXECUTABLE(GdcmToBaseline ${GdcmToBaseline_SOURCES})
+TARGET_LINK_LIBRARIES(GdcmToBaseline
+ vtkgdcm
+ vtkIO
+ vtkImaging
+ vtkRendering
+)
+
+#-----------------------------------------------------------------------------
# Install vtk header
INSTALL_FILES(/include FILES vtkGdcmReader.h)
--- /dev/null
+/*=========================================================================
+
+ Program: gdcm
+ Module: $RCSfile: GdcmToBaseline.cxx,v $
+ Language: C++
+ Date: $Date: 2004/11/30 15:44:44 $
+ 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 "vtkImageViewer.h"
+#include "vtkImageData.h"
+#include "vtkPNGWriter.h"
+#include "vtkWindowToImageFilter.h"
+
+
+
+
+#include "gdcmFile.h"
+
+#include <iostream>
+
+//Generated file:
+#include "gdcmDataImages.h"
+
+int main(int argc, char *argv[])
+{
+ if( argc < 3 )
+ {
+ std::cerr << "Usage: " << argv[0] << " image.dcm image.png\n";
+ return 0;
+ }
+
+ std::string filename = argv[1];
+ std::cout << "Filename: " << filename << std::endl;
+
+ //Extract name to find the png file matching:
+ std::string pngfile = argv[2];
+ std::cerr << "PNG file: " << pngfile << std::endl;
+
+ // Ok for now still use the original image,
+ vtkGdcmReader *reader = vtkGdcmReader::New();
+ reader->SetFileName( filename.c_str() );
+ //reader->SetFileName( "../Testing/Temporary/TestWrite.dcm" );
+ reader->Update();
+
+ vtkImageViewer *viewer = vtkImageViewer::New();
+ viewer->SetInput ( reader->GetOutput() );
+
+ vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
+ 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->OffScreenRenderingOn();
+
+ if(dim[2] != 1)
+ {
+ //For multifame dicom, take a snapshot of the center slice (+/- 1)
+ viewer->SetZSlice( dim[2] / 2 );
+ }
+
+ viewer->Render();
+
+ // View to image
+ vtkWindowToImageFilter *wif = vtkWindowToImageFilter::New();
+ wif->SetInput(viewer->GetRenderWindow());
+
+ // Write to image
+ vtkPNGWriter *writer=vtkPNGWriter::New();
+ writer->SetFileName(argv[2]);
+ writer->SetInput(wif->GetOutput());
+ writer->Write();
+
+ // Clean up:
+ reader->Delete();
+ viewer->Delete();
+ wif->Delete();
+ writer->Delete();
+
+ return 0;
+}
#include <vtkPointData.h>
#include <vtkLookupTable.h>
-vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.56 $");
+vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.57 $");
vtkStandardNewMacro(vtkGdcmReader);
//-----------------------------------------------------------------------------
unsigned long UpdateProgressCount = 0;
// Feeling the allocated memory space with each image/volume:
- unsigned char *Dest = (unsigned char *)data->GetPointData()->GetScalars()->GetVoidPointer(0);
+ unsigned char *Dest = (unsigned char *)data->GetScalarPointer();
for (std::list<std::string>::iterator filename = InternalFileNameList.begin();
filename != InternalFileNameList.end();
++filename)
// fwrite(Dest,size,1,f2);
// fclose(f2);
- //GetImageData allocate a (void*)malloc, remove it:
-
- // CLEANME
- // Now, the delete on values keep from GetImageData is useless (made in
- // the PixelConvert class)
-
-// unsigned char * pSource = source; //pointer for later deletion
-// delete[] pSource;
return size;
}
#ifndef __vtkGdcmReader_h
#define __vtkGdcmReader_h
+#include "gdcmCommon.h" // To avoid warnings concerning the std
+
#include <vtkImageReader.h>
#include <list>
#include <string>
// Callback for the interaction
class vtkgdcmObserver : public vtkCommand
{
- public:
- virtual char const *GetClassName() const { return "vtkgdcmObserver";}
- static vtkgdcmObserver *New()
- { return new vtkgdcmObserver; }
- vtkgdcmObserver()
- {
+public:
+ virtual char const *GetClassName() const
+ {
+ return "vtkgdcmObserver";
+ }
+ static vtkgdcmObserver *New()
+ {
+ return new vtkgdcmObserver;
+ }
+ vtkgdcmObserver()
+ {
this->ImageViewer = NULL;
- }
- virtual void Execute(vtkObject *, unsigned long event, void* )
- {
+ }
+ virtual void Execute(vtkObject *, unsigned long event, void* )
+ {
if ( this->ImageViewer )
- {
- if ( event == vtkCommand::CharEvent )
- {
+ {
+ if ( event == vtkCommand::CharEvent )
+ {
int max = ImageViewer->GetWholeZMax();
int slice = (ImageViewer->GetZSlice() + 1 ) % ++max;
ImageViewer->SetZSlice( slice );
ImageViewer->GetRenderer()->ResetCameraClippingRange();
ImageViewer->Render();
- }
- }
- }
- vtkImageViewer2 *ImageViewer;
+ }
+ }
+ }
+ vtkImageViewer2 *ImageViewer;
};
int main(int argc, char *argv[])
{
- if( argc < 2 )
- return 0;
+ if( argc < 2 )
+ return 0;
- vtkGdcmReader *reader = vtkGdcmReader::New();
- reader->AllowLookupTableOff();
+ vtkGdcmReader *reader = vtkGdcmReader::New();
+ reader->AllowLookupTableOff();
- if( argc == 2 )
- reader->SetFileName( argv[1] );
- else
- for(int i=1; i< argc; i++)
- reader->AddFileName( argv[i] );
+ if( argc == 2 )
+ reader->SetFileName( argv[1] );
+ else
+ for(int i=1; i< argc; i++)
+ reader->AddFileName( argv[i] );
- reader->DebugOn();
- reader->Update();
-
- //print debug info:
- reader->GetOutput()->Print( cout );
-
- vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
+ reader->Update();
- vtkImageViewer2 *viewer = vtkImageViewer2::New();
-
- if( reader->GetLookupTable() )
- {
- //convert to color:
- vtkImageMapToColors *map = vtkImageMapToColors::New ();
- map->SetInput (reader->GetOutput());
- map->SetLookupTable (reader->GetLookupTable());
- map->SetOutputFormatToRGB();
- viewer->SetInput ( map->GetOutput() );
- map->Delete();
- }
- else
- {
- viewer->SetInput ( reader->GetOutput() );
- }
- viewer->SetupInteractor (iren);
-
- //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
- //viewer->SetColorWindow (range[1] - range[0]);
- //viewer->SetColorLevel (0.5 * (range[1] + range[0]));
-
- // Here is where we setup the observer,
- vtkgdcmObserver *obs = vtkgdcmObserver::New();
- obs->ImageViewer = viewer;
- iren->AddObserver(vtkCommand::CharEvent,obs);
- obs->Delete();
-
- iren->Initialize();
- iren->Start();
-
- //if you wish you can export dicom to a vtk file
- vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
- writer->SetInput( reader->GetOutput());
- writer->SetFileName( "foo.vtk" );
- writer->SetFileTypeToBinary();
- writer->Write();
-
- reader->Delete();
- iren->Delete();
- viewer->Delete();
- writer->Delete();
+ //print debug info:
+ reader->GetOutput()->Print( cout );
+
+ vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
+
+ vtkImageViewer2 *viewer = vtkImageViewer2::New();
+
+ if( reader->GetLookupTable() )
+ {
+ //convert to color:
+ vtkImageMapToColors *map = vtkImageMapToColors::New ();
+ map->SetInput (reader->GetOutput());
+ map->SetLookupTable (reader->GetLookupTable());
+ map->SetOutputFormatToRGB();
+ viewer->SetInput ( map->GetOutput() );
+ map->Delete();
+ }
+ else
+ {
+ double *range = reader->GetOutput()->GetScalarRange();
+ viewer->SetColorLevel (0.5 * (range[1] + range[0]));
+ viewer->SetColorWindow (range[1] - range[0]);
+
+ viewer->SetInput ( reader->GetOutput() );
+ }
+ viewer->SetupInteractor (iren);
- return 0;
+ //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange();
+ //viewer->SetColorWindow (range[1] - range[0]);
+ //viewer->SetColorLevel (0.5 * (range[1] + range[0]));
+
+ // Here is where we setup the observer,
+ vtkgdcmObserver *obs = vtkgdcmObserver::New();
+ obs->ImageViewer = viewer;
+ iren->AddObserver(vtkCommand::CharEvent,obs);
+ obs->Delete();
+
+ iren->Initialize();
+ iren->Start();
+
+ //if you wish you can export dicom to a vtk file
+ vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New();
+ writer->SetInput( reader->GetOutput());
+ writer->SetFileName( "foo.vtk" );
+ writer->SetFileTypeToBinary();
+ writer->Write();
+
+ reader->Delete();
+ iren->Delete();
+ viewer->Delete();
+ writer->Delete();
+
+ return 0;
}