Thank you. Using the ImageReslice I was able to extract the desired part of the image. That said, I am still struggling with doing so at a target resolution (for example I want to get a square segment that is 512x512 from a larger image, but render it into a 256x256 image. I am trying to do so by using the vtkImageResize method SetOutputDimensions(256,256,1) (on the output of the REslice). When I do that although VTK throws an error :
5 ERR| vtkImageResize (0x5573d537f820): ThreadedRequestData: output scalar type does not match input scalar type
I could not find anywhere in the internet this error message alongside vtk Resize. Am I doing somethign very wrong or is it some other step I am missing in the pipeline ? A sample of how I am doing it:
vtkSmartPointer reader =
vtkSmartPointer::New();
reader->SetFileName(inputFilename.c_str());
reader->Update();
// Setup offscreen rendering
vtkSmartPointer<vtkGraphicsFactory> graphics_factory =
vtkSmartPointer<vtkGraphicsFactory>::New();
graphics_factory->SetOffScreenOnlyMode( 1);
graphics_factory->SetUseMesaClasses( 1 );
auto image_ptr = reader->GetOutput();
vtkSmartPointer<vtkImageReslice> reslice =
vtkSmartPointer<vtkImageReslice>::New();
reslice->SetOutputExtent(0, 100, 0, 100, 0, 0);
reslice->SetOutputOrigin(150,50,0);
reslice->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkImageResize> resize =
vtkSmartPointer<vtkImageResize>::New();
resize->SetInputData(reslice->GetOutput());
resize->SetOutputDimensions(256, 256, 1);
//resize->SetMagnificationFactors(1.0,1.0,1.0);
vtkSmartPointer<vtkImageMapper> mapper = vtkSmartPointer<vtkImageMapper>::New();
mapper->SetInputConnection(resize->GetOutputPort());
vtkSmartPointer<vtkActor2D> actor =
vtkSmartPointer<vtkActor2D>::New();
actor->SetMapper(mapper);
actor->SetPosition(0,0);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetOffScreenRendering( 1 );
renderWindow->AddRenderer(renderer);
// Add the actors to the scene
renderer->AddActor(actor);
//renderer->SetActiveCamera(camera);
renderWindow->SetSize(512,512);
renderWindow->Render();
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInput(renderWindow);
windowToImageFilter->Update();
vtkSmartPointer<vtkPNGWriter> writer =
vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName("screenshot.png");
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();