截图来自vtkRenderWindow无国界

时间:2017-03-14 20:07:43

标签: java image vtk

我尝试了我发现的所有内容,只保存了我没有成功的图像。 我的图像是124x126,所以当图像保存时,它总是带边框和新尺寸300x300,如果我使用另一个程序只选择我的图像它是208x209。 所以我不知道为什么我的图像缩放,为什么它总是300x300,如果我将vtkRenderWindow的大小更改为124x126,边框仍然存在,我的图像缩小。 我的问题是如何在没有边框的情况下保存124x126的图像?

        mapper.SetInputConnection(polyDataReader.GetOutputPort()); 
        vtkActor actor = new vtkActor(); 
        actor.SetMapper(mapper); 
        actor.GetBounds(bounds); 
        System.out.println("actor: " + bounds[1] + " x " + bounds[3]);    // 124x126 (everything's ok)

        //Create a renderer, render window, and interactor 
        vtkRenderer renderer = new vtkRenderer(); 

        vtkRenderWindow renderWindow = new vtkRenderWindow(); 
        renderWindow.BordersOff();      // the borders are still there     
        renderWindow.AddRenderer(renderer); 

        vtkRenderWindowInteractor renderWindowInteractor = new vtkRenderWindowInteractor(); 
        renderWindowInteractor.SetRenderWindow(renderWindow); 


        //Add the actor to the scene 
        renderer.AddActor(actor); 
        renderer.SetBackground(0, 0, 0); 


        //Render and interact 
        renderWindow.Render(); 

        //screenshot code: 
        vtkWindowToImageFilter w2if = new vtkWindowToImageFilter(); 
        w2if.SetInput(renderWindow); 
        w2if.Update(); 

        vtkPNGWriter writer = new vtkPNGWriter(); 
        writer.SetFileName("out.png");      //my image with borders 300x300 !!!!??
        writer.SetInputData(w2if.GetOutput()); 
        writer.Write(); 

image saved with borders

ps:对不起我的英文

1 个答案:

答案 0 :(得分:0)

这是因为您的渲染窗口的默认大小为300x300。

你要意识到的是,polydata是在3D场景中渲染的,你所谓的" border"是背景,其数量取决于缩放级别,即在相机的位置。为了得到你想要的东西,你需要做两件事:

  • 将渲染窗口大小调整为所需的图像大小:

renderWindow.SetSize(bounds[1], bounds[3]);

  • 重新定位相机,以便actor完全填充视口。尝试

renderer.GetActiveCamera().SetParallelScale(1); // we want parallel projection renderer.GetActiveCamera().SetParallelScale(0.5 * (bounds[3] - bounds[2])); // zoom

缩放的范围可能是0.5 *(边界[1] - 边界[0]),不完全确定它应该是矩形的哪一边。

希望这有帮助,

米罗