1. 程式人生 > >VTK繪圖視窗vtkRenderWindow 儲存為圖片,並且不顯示繪圖視窗

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;

	}

主要的點: