VTK绘图窗口vtkRenderWindow 保存为图片,并且不显示绘图窗口

小编 2026-06-15 阅读:152 评论:0
VTK绘图窗口vtkRenderWindow 保存为图片,并且不显示绘图窗口   参考链接; https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualizati...

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

 

代码如下:

/*
	 * 某个面数据; 输出图片路径和名称 ;是否可视化绘图结果
	 */
	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;

	}

主要的点:

\"\"

\"\"

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表