VTK数据的读写

 本文介绍VTK中数据模型的读写。

模型数据获取

  VTK应用程序所需的数据可以通过两种途径获取:第一种是生成模型,然后处理这些模型数据(如由类vtkCylinderSource生成的多边形数据);第二种是读取相关的数据文件,然后处理这些读入的数据(如vtkBMPReader读取的BMP图像)。

Reader与Writer类

  VTK针对不同的数据类型,提供了不同的读写类。

1、数据读写

VTK的Reader类,要将外部数据读入可视化管线,主要涉及的步骤如下。
1. 实例化Reader对象。
2. 指定所要读取的文件名。
3. 调用Update()方法促使管线执行。当管线后续的Filter有Update()请求时,如调用Reader()方法管线就会读取相应的图像文件,所以这一步有时也可省略。

使用Writer类的主要步骤如下。
1. 实例化Writer对象。
2. 输入要写盘的数据以及指定待写盘的文件名。
3. 用Writer()方法促使Writer类开始写盘操作。

2、场景的导入导出

场景的导入与导出是指将渲染场景中的对象,包括光照、相机、Actor属性、变换矩阵等信息写入文件中,或者从外部文件中将这些对象导入渲染场景中,一般所导入的文件含有多个数据集。

图像读写示例

示例读取一幅BMP图像并显示,然后保存。
CMakeLists.txt文件代码如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(ReadWriterSingleImage)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(ReadWriteSingleImage ReadWriteSingleImage.cpp)
TARGET_LINK_LIBRARIES(ReadWriteSingleImage ${VTK_LIBRARIES})

ReadWriteSingleImage.cpp文件代码如下:

#include <vtkSmartPointer.h>
#include <vtkPNGReader.h>
#include <vtkJPEGWriter.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>

int main(int argc, char* argv[])
{

    //读取PNG图像
    vtkSmartPointer<vtkPNGReader> reader = vtkSmartPointer<vtkPNGReader>::New();
    reader->SetFileName("E:/TestData/VTK-logo.png");

    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();

    //显示读取的单幅PNG图像
    vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetInteractorStyle(style);

    imageViewer->SetupInteractor(renderWindowInteractor);
    imageViewer->Render();
    imageViewer->GetRenderer()->ResetCamera();
    imageViewer->Render();

    imageViewer->SetSize(640, 480);
    imageViewer->GetRenderWindow()->SetWindowName("ReadWriteSingleImage");

    //保存成JPG图像
    vtkSmartPointer<vtkJPEGWriter> writer = vtkSmartPointer<vtkJPEGWriter>::New();
    writer->SetFileName("E:/TestData/VTK-logo.jpg");
    writer->SetInputConnection(reader->GetOutputPort());
    writer->Write();

    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

运行结果如下:

这里写图片描述

文件夹下多了VTK-logo.jpg文件:

代码解释:

示例中在显示图像时,并没有用到vtkRenderWindow、vtkRenderer、vtkActor等类,而只是使用了vtkImageViewer以及设置了交互样式。这是因为类vtkImageViewer已经封装了vtkRenderWindow,vtkRenderer,vtkActor2D和vtkImageMapper。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值