// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause // Use vtkImageHistogramStatistics to auto compute the window/level // // The command line arguments are: // -I => run in interactive mode #include "vtkSmartPointer.h" #include "vtkCamera.h" #include "vtkImageData.h" #include "vtkImageHistogramStatistics.h" #include "vtkImageProperty.h" #include "vtkImageSlice.h" #include "vtkImageSliceMapper.h" #include "vtkInteractorStyleImage.h" #include "vtkPNGReader.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkTestUtilities.h" int ImageAutoRange(int argc, char* argv[]) { vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer style = vtkSmartPointer::New(); vtkSmartPointer renWin = vtkSmartPointer::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); vtkSmartPointer reader = vtkSmartPointer::New(); char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/fullhead15.png"); reader->SetFileName(fname); delete[] fname; vtkSmartPointer statistics = vtkSmartPointer::New(); statistics->SetInputConnection(reader->GetOutputPort()); statistics->GenerateHistogramImageOff(); statistics->Update(); // Get a viewing range based on the full data range double range[2]; range[0] = statistics->GetMinimum(); range[1] = statistics->GetMaximum(); // Use the autorange feature to get a better image range double autorange[2]; statistics->GetAutoRange(autorange); for (int i = 0; i < 2; i++) { vtkSmartPointer renderer = vtkSmartPointer::New(); vtkCamera* camera = renderer->GetActiveCamera(); renderer->SetBackground(0.0, 0.0, 0.0); renderer->SetViewport(0.5 * (i & 1), 0.0, 0.5 + 0.5 * (i & 1), 1.0); renWin->AddRenderer(renderer); vtkSmartPointer imageMapper = vtkSmartPointer::New(); imageMapper->SetInputConnection(reader->GetOutputPort()); const double* bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5 * (bounds[0] + bounds[1]); point[1] = 0.5 * (bounds[2] + bounds[3]); point[2] = 0.5 * (bounds[4] + bounds[5]); camera->SetFocalPoint(point); point[imageMapper->GetOrientation()] += 500.0; camera->SetPosition(point); camera->SetViewUp(0.0, 1.0, 0.0); camera->ParallelProjectionOn(); camera->SetParallelScale(128); vtkSmartPointer image = vtkSmartPointer::New(); image->SetMapper(imageMapper); renderer->AddViewProp(image); if ((i & 1) == 0) { image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5 * (range[0] + range[1])); } else { image->GetProperty()->SetColorWindow(autorange[1] - autorange[0]); image->GetProperty()->SetColorLevel(0.5 * (autorange[0] + autorange[1])); } } renWin->SetSize(512, 256); iren->Initialize(); renWin->Render(); iren->Start(); return EXIT_SUCCESS; }