GDCM
2.2.3
|
/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.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 notice for more information. =========================================================================*/ import vtk.*; import gdcm.*; import java.io.File; /* * Compilation: * CLASSPATH=vtkgdcm.jar:/usr/share/java/vtk.jar javac MPRViewer.java * * Usage: * LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/xawt:/usr/lib/jni:. CLASSPATH=/usr/share/java/vtk.jar:vtkgdcm.jar:gdcm.jar:. java MPRViewer BRAINX * */ public class MPRViewer { static { // VTK System.loadLibrary("vtkCommonJava"); System.loadLibrary("vtkFilteringJava"); System.loadLibrary("vtkIOJava"); System.loadLibrary("vtkImagingJava"); System.loadLibrary("vtkGraphicsJava"); System.loadLibrary("vtkRenderingJava"); // VTK-GDCM System.loadLibrary("vtkgdcmJava"); } static FilenamesType fns = new FilenamesType(); public static void process(String path) { fns.add( path ); } // Process only files under dir public static void visitAllFiles(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i=0; i<children.length; i++) { visitAllFiles(new File(dir, children[i])); } } else { process(dir.getPath()); } } public static void main(String[] args) throws Exception { String dirname = args[0]; if( !PosixEmulation.FileIsDirectory( dirname ) ) { return; } File dir = new File(dirname); visitAllFiles(dir); IPPSorter ipp = new IPPSorter(); ipp.SetComputeZSpacing( true ); ipp.SetZSpacingTolerance( 1e-3 ); boolean b = ipp.Sort( fns ); if(!b) { throw new Exception("Could not scan"); } double ippzspacing = ipp.GetZSpacing(); FilenamesType sorted = ipp.GetFilenames(); vtkStringArray files = new vtkStringArray(); long nfiles = sorted.size(); //for( String f : sorted ) for (int i = 0; i < nfiles; i++) { String f = sorted.get(i); files.InsertNextValue( f ); } vtkGDCMImageReader reader = new vtkGDCMImageReader(); reader.SetFileNames( files ); reader.Update(); // get spacing value double[] spacing = reader.GetOutput().GetSpacing(); vtkImageChangeInformation change = new vtkImageChangeInformation(); change.SetInputConnection( reader.GetOutputPort() ); change.SetOutputSpacing( spacing[0], spacing[1], ippzspacing ); // A simple vtkInteractorStyleImage example for // 3D image viewing with the vtkImageResliceMapper. // // Drag Left mouse button to window/level // Shift-Left drag to rotate (oblique slice) // Shift-Middle drag to slice through image // OR Ctrl-Right drag to slice through image // Create the RenderWindow, Renderer vtkRenderer ren1 = new vtkRenderer(); vtkRenderWindow renWin = new vtkRenderWindow(); renWin.AddRenderer(ren1); vtkImageResliceMapper im = new vtkImageResliceMapper(); im.SetInputConnection(change.GetOutputPort()); im.SliceFacesCameraOn(); im.SliceAtFocalPointOn(); im.BorderOff(); vtkImageProperty ip = new vtkImageProperty(); ip.SetColorWindow(2000); ip.SetColorLevel(1000); ip.SetAmbient(0.0); ip.SetDiffuse(1.0); ip.SetOpacity(1.0); ip.SetInterpolationTypeToLinear(); vtkImageSlice ia = new vtkImageSlice(); ia.SetMapper(im); ia.SetProperty(ip); ren1.AddViewProp(ia); ren1.SetBackground(0.1,0.2,0.4); renWin.SetSize(300,300); vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor(); vtkInteractorStyleImage style = new vtkInteractorStyleImage(); style.SetInteractionModeToImage3D(); iren.SetInteractorStyle(style); renWin.SetInteractor(iren); // render the image renWin.Render(); vtkCamera cam1 = ren1.GetActiveCamera(); cam1.ParallelProjectionOn(); ren1.ResetCameraClippingRange(); renWin.Render(); iren.Start(); } }