VTK绘图窗口vtkRenderWindow 保存为图片,并且不显示绘图窗口
VTK绘图窗口vtkRenderWindow 保存为图片,并且不显示绘图窗口
参考链接;
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CloseWindow
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Utilities/OffScreenRendering
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Utilities/Screenshot
https://zhangxc.com/2015/03/vtk-workflow
代码如下:
/*
* 某个面数据; 输出图片路径和名称 ;是否可视化绘图结果
*/
private static void saveAsJPGTriangleStripsDataStructureMapping(
double[][] data, String filename, boolean flag) {
// TODO Auto-generated method stub
vtkPolyData ploydata = new vtkPolyData();
vtkPoints points = new vtkPoints();
vtkCellArray cellArray = new vtkCellArray();
vtkFloatArray scalars = new vtkFloatArray();
int[][] posID = new int[data.length][data[0].length];
// 插入点
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[0].length; j++) {
int id0 = points.InsertNextPoint(i, j, 0);
posID[i][j] = id0;
scalars.InsertNextTuple1(data[i][j]);
}
}
// 构造数据结构:三角形带strip
for (int i = 0; i < data.length - 1; i++) {
cellArray.InsertNextCell(data[0].length * 2);
for (int j = 0; j < data[0].length; j++) {
cellArray.InsertCellPoint(posID[i][j]);
cellArray.InsertCellPoint(posID[i + 1][j]);
}
}
// We now assign the pieces to the vtkPolyData.
ploydata.SetPoints(points);
ploydata.SetStrips(cellArray);// SetStrips设置单元排列(cell array)定义三角形带strip
ploydata.GetPointData().SetScalars(scalars);
double[] scalarRange = ploydata.GetScalarRange();
// 定义线性颜色映射表,连续颜色映射
vtkLookupTable lut = new vtkLookupTable();
lut.SetHueRange(0.3, 1.0);// 色调
lut.SetAlphaRange(0.9, 0.95);
lut.SetValueRange(0.9, 1);
lut.SetSaturationRange(0.95, 0.97);
lut.SetNumberOfTableValues(256);
lut.SetRange(scalarRange);
lut.SetScaleToLinear();
lut.Build();
// Now we'll look at it.
vtkPolyDataMapper Mapper = new vtkPolyDataMapper();
Mapper.SetInputData(ploydata);
Mapper.SetScalarRange(ploydata.GetScalarRange()[0],
ploydata.GetScalarRange()[1]);
Mapper.SetLookupTable(lut);
vtkActor actor = new vtkActor();
actor.SetMapper(Mapper);
vtkRenderer ren = new vtkRenderer();
ren.SetBackground(1, 1, 1);
ren.AddActor(actor);
vtkRenderWindow renWin = new vtkRenderWindow();
renWin.AddRenderer(ren);
if (!flag) {
renWin.SetOffScreenRendering(1);// 保存绘图窗口时,不显示该窗口
}
// renWin.SetSize(800, 600);
// renWin.SetAlphaBitPlanes(1);
vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
vtkCamera cam = new vtkCamera();
cam.SetFocalPoint(0, 0, 0);
cam.SetPosition(0, 0, 1);
cam.ComputeViewPlaneNormal();
cam.SetViewUp(0, 1, 0);
// cam.Zoom(2);
ren.SetActiveCamera(cam);
/*
* 要在vtk中添加新的交互方式需要从vtkInteractorStyle 类中派生新的类,
* 如vtkInteractorStyleTrackballCamera实现操作杆交互方式,对相机进行交互。
*/
vtkInteractorStyleTrackballCamera style = new vtkInteractorStyleTrackballCamera();
iren.SetInteractorStyle(style);
renWin.Render();
ren.ResetCamera();
renWin.SetWindowName("vtk_show");
// Screenshot
vtkWindowToImageFilter wif = new vtkWindowToImageFilter();
wif.SetInput(renWin);
// wif.SetMagnification(2); // set the resolution of the output image (3
// // times the current resolution of vtk
// // render window)
// wif.SetInputBufferTypeToRGBA(); // also record the alpha
// (transparency)
// // channel
// wif.ReadFrontBufferOff(); // read from the back buffer
wif.Update();
// vtkPNGWriter writer = new vtkPNGWriter();
// writer.SetFileName("././data/screenshot2.png");
// writer.SetInputConnection(wif.GetOutputPort());
// writer.Write();
vtkJPEGWriter writer = new vtkJPEGWriter();
writer.SetFileName(filename);
writer.SetInputConnection(wif.GetOutputPort());
writer.Write();
if (flag) {// 保存绘图窗口时不能有该操作
iren.Initialize();
iren.Start();
} else {
iren.GetRenderWindow().Finalize();// 关闭绘图窗口
}
return;
}
主要的点: