当前位置: 首页 > news >正文

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;

	}

主要的点:

相关文章:

  • NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the lat
  • ~/caffe$ make all -j8 Makefile:606: recipe for target '.build_release/cuda/src/caffe/solvers/adam_s
  • File /usr/bin/pip, line 9, in module from pip import main ImportError: cannot import name m
  • python:pycharm 读取项目中的文件:相对路径和绝对路径
  • python数组复制(转载)
  • ubuntu16.04 caffe编译过程记录
  • pip安装提示:fatal error in launcher:unable to create process using。
  • python+VTK 安装教程
  • caffe 训练过程中输出log日志,并可视化loss和accuracy曲线
  • maven工程依赖的jar包,在本地仓库有,但是pom.xml文件却报错找不到jar包;IDEA运行项目类文件报错:java: 错误: 无效的源发行版:16
  • c++小细节/技巧
  • 范德蒙行列式
  • 代数余子式之和计算技巧
  • 伴随矩阵A*
  • 初等矩阵
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Date型的使用
  • Elasticsearch 参考指南(升级前重新索引)
  • go语言学习初探(一)
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Laravel 实践之路: 数据库迁移与数据填充
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring Cloud Feign的两种使用姿势
  • vagrant 添加本地 box 安装 laravel homestead
  • 包装类对象
  • 从零开始在ubuntu上搭建node开发环境
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 计算机在识别图像时“看到”了什么?
  • 使用putty远程连接linux
  • 思考 CSS 架构
  • 我有几个粽子,和一个故事
  • 一天一个设计模式之JS实现——适配器模式
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • HanLP分词命名实体提取详解
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​ssh免密码登录设置及问题总结
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #define
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #pragma once与条件编译
  • #stm32驱动外设模块总结w5500模块
  • $.each()与$(selector).each()
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转载)利用webkit抓取动态网页和链接
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划