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;

	}

主要的点:

猜你喜欢

转载自blog.csdn.net/sinat_23619409/article/details/85206169
今日推荐