前言
vtkImageActor类的官方文档vtkImageActor;
vtkImageActor被用来在三维场景下渲染图像,通过纹理映射将图像映射到一个多边形上进行显示;图像被放在了设定好的起始坐标点上(一般是设定了图像的左上角第一个像素的坐标),图像的尺寸由dimensions和spacing设定;图像的方向与x-y-z轴之一正交,这取决于定义图像的平面。这个类已经被vtkImageSlice类所取代,它提供了比vtkImageActor更多的功能。
之前说过vtkImageViewer2类可以用来显示渲染图像,vtkImageActor同样可以渲染图像,使用vtkImageActor较vtkImageViewer2要复杂一些,需要建立完整的渲染管线:包括vtkImageActor、vtkRender、vtkRenderWindow和vtkRenderWindowInteractor。
另外,如果不需要在三维空间中进行旋转操作,就需要为vtkRenderWindowInteractor定义一个vtkInteractorStyleImage对象;如果需要设置图像在三维空间不同的位置和姿态,就需要对vtkActor设置转换矩阵;vtkRenderWindowInteractor只是将交互方式给屏蔽掉了;
1.vtkImageActor接口
1.1 数据源
virtual void SetInputData(vtkImageData*);
virtual vtkImageData* GetInput();
这个两个函数基本不在使用,使用GetMapper()->SetInputConnection()和imgActor->GetMapper()->GetOutputPort()代替;
1.1 图像透明度
virtual void SetOpacity(double);
virtual double GetOpacity();
double GetOpacityMinValue() { return 0.0; }
double GetOpacityMaxValue() { return 1.0; }
0.0表示透明,1.0表示不透明;默认值为1.0;
1.1 显示范围
void SetDisplayExtent(const int extent[6]);
void SetDisplayExtent(int minX, int maxX, int minY, int maxY, int minZ, int maxZ);
void GetDisplayExtent(int extent[6]);
int* GetDisplayExtent() VTK_SIZEHINT(6) { return this->DisplayExtent; }
double* GetBounds() VTK_SIZEHINT(6) override;void GetB
unds(double bounds[6]) { this->Superclass::GetBounds(bounds); }
double* GetDisplayBounds();void GetDisplayBounds(double bounds[6]);
2.实例
2.1步骤
1.使用vtkBMPReader读入图像;
2.建立vtkImageActor对象;
3.建立vtkRender对象;
4.建立vtkRenderWindow对象;
5.建立vtkRenderWindowInteractor对象;
6.建立vtkInteractorStyleImage交互对象;
7.组装渲染管线;
2.2 代码
#include "vtkSmartPointer.h"
#include "vtkBMPReader.h"
#include "vtkImageActor.h"
#include "vtkImageSlice.h"
#include "vtkImageMapper3D.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName("D:\\test.bmp");
reader->Update();
vtkSmartPointer<vtkImageActor> imgActor = vtkSmartPointer<vtkImageActor>::New();
imgActor->GetMapper()->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(imgActor);
renderer->SetBackground(0.4, 0.5, 0.6);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetSize(500, 500);
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();
return 0;
}
3.资料
1.《VTK图形图像开发进阶》第五章 VTK图像处理
2. https://vtk.org/