1、前言
对于应用程序而言,都需要处理特定的数据,VTK应用程序也不例外。
VTK应用程序所需的数据可以通过两种途径获取:
第一种是生成模型,然后处理这些模型数据(如由类 vtkCylinderSource 生成的多边形数据);
第二种是从外部存储介质里导入相关的数据文件,然后在应用程序中处理这些读入的数据(如vtkBMPReader 读取 BMP图像)。
另一方面,VTK也可以将程序中处理完成的数据写入单个文件中,或者将所渲染的场景导出,以备后续操作的使用。
从可视化管线的角度来看,一般以数据的读取(或由模型创建数据)开始,而以数据的写盘操作(或Mapper)结束,重点学习可视化管线两端相关的类,包括数据读写以及场景的导入导出。
2、Reader 类与Writer类
1)、常规步骤
要将外部数据读入可视化管线,主要的步骤如下。
1)实例化 Reader 对象。
2)指定所要读取的文件名。
3)调用 Update()方法促使管线执行。当管线后续的Fiter有Update()请求时,如调用Render()方法管线就会读取相应的图像文件,所以这一步有时也可省略。
Writer 类的主要步骤如下:
1)实例化 Writer 对象。
2)输入要写盘的数据以及指定待写盘的文件名。
3)调用 Write0方法促使 Writer 类开始写盘操作。
VTK 提供了不同的 Reader/riter 类读写各种文件,对于类的使用者而言,最重要的是根据不同的文件类型选择合适的 Reader/Writer 类进行读写操作,不同的 Reader 类所输出的数据类型不相同,不同的 Writer 类所要求输入的数据类型也不同。
2)、读写类型对象
根据不同的数据集类型有不同 Reader/Writer 类:
3)、Png图像读取
private void RenderPNGImage()
{vtkPNGReader pngReader = vtkPNGReader.New();pngReader.SetFileName("D:\\图像\\boxes\\cardboard_boxes_01.png");pngReader.Update();vtkImageActor imageActor = vtkImageActor.New();imageActor.SetInputData(pngReader.GetOutput());imageActor.Update();vtkRenderer render = vtkRenderer.New();render.AddActor(imageActor);vtkRenderWindow renWin = renderWindowControl.RenderWindow;renWin.AddRenderer(render);renWin.Render();
}
4)、使用Factory读取图像
该类会试着寻找一种最适合的类对图像做读取操作,可以读取大部分标准格式的图像文件
private void RenderImageUn(){string fileName = "D:\\图像\\boxes\\cardboard_boxes_01.png";vtkImageReader2 reader = vtkImageReader2Factory.CreateImageReader2(fileName);reader.SetFileName(fileName);reader.Update();vtkImageActor imageActor = vtkImageActor.New();imageActor.SetInputData(reader.GetOutput());vtkRenderer render = vtkRenderer.New();render.AddActor(imageActor);vtkRenderWindow renWin = renderWindowControl.RenderWindow;renWin.AddRenderer(render);renWin.Render();}
5)、读取序列图像
医学图像应用程序中常常会处理序列的图像文件,比如计算机断层成像或者磁共振成像所成的图像一般都是由多个有顺序的二维图像组成,应用程序需要一次性导入一个序列的二维图像。VTK没有提供专门的类读取序列图像文件,但VTK的图像 Reader 类都有提供方法 SetFileNames()来设置多个图像文件名,利用该方法可以实现序列图像的读取。示例 首先读取-个JPG 的序列图像 Head,该序列图像包含 100 张大小为 256x256 像素的二维图像,由这 100张二维图像组成一个三维数据体。
private void RenderSeries()
{vtkStringArray fileArray = vtkStringArray.New();for (int i = 1; i < 100; i++){string ss = $"F:\\code\\VTK\\TestActiViz\\bin\\Debug\\data\\Head\\head{string.Format("{0:000}", i)}.jpg";fileArray.InsertNextValue(ss);}//读取JPG序列图像vtkJPEGReader reader = vtkJPEGReader.New(); reader.SetFileNames(fileArray);vtkImageViewer2 viewer = vtkImageViewer2.New();viewer.SetInputConnection(reader.GetOutputPort());// vtkRenderWindowInteractor windowInteractor = vtkRenderWindowInteractor.New();vtkRenderWindow renWin = renderWindowControl.RenderWindow;viewer.SetSlice(50);viewer.SetSliceOrientationToXY();viewer.SetRenderWindow(renWin);// viewer.Render();renWin.Render();}