vtkWindowToImageFilter
使用vtkWindow作为图像管道的输入。
vtkWindowToImageFilter提供读取vtkWindow中的数据并将其用作成像管道的输入所需的方法。可以将图像保存到文件。窗口图像可以读取为RGB或RGBA像素;此外,还可以读取深度缓冲区。RGB和RGBA像素的类型为unsigned char,而Z缓冲区数据以浮点形式返回。使用此过滤器可将RenderWindows或ImageWindows转换为图像格式。
注意:
vtkWindow的行为与VTK管道的其他部分不同:在渲染图像时,它的修改时间不会得到更新。因此,使用vtkWindowToImageFilter将生成窗口渲染的第一个图像的图像,但在随后的窗口更新中,该图像永远不会更新。这种行为是意外的,通常是不受欢迎的。
注意:要强制更新输出图像,请在渲染到窗口后调用vtkWindowToImageFilter的Modified方法。
在VTK版本4和更高版本中,此过滤器是将窗口图像输出到文件的规范方法的一部分(替换3.2和更早版本中存在的vtkRenderWindows的过时SaveImageAsPPM方法)。将此筛选器连接到窗口的输出,并将筛选器的输出连接到诸如vtkPNGWriter之类的编写器。
读回alpha平面取决于渲染窗口的GetRGBACharPixelData方法的正确操作,而GetRGBACharPixelData方法又取决于窗口的alpha平面的配置。从vtk4.4+开始,由于这些依赖关系,独立于机器的行为不能自动得到保证。
主要接口
设置输入
void SetInput(vtkWindow* input);
指示从哪个渲染窗口获取像素数据。
一般就是vtkRenderWindow指针对象;
设置缩放比例
void SetScale(int scale) { this->SetScale(scale, scale); }
设置X和Y的比例(或放大倍数)
设置从窗口中获取图像的类型
vtkSetMacro(InputBufferType, int);
vtkGetMacro(InputBufferType, int);
void SetInputBufferTypeToRGB() { this->SetInputBufferType(VTK_RGB); }
void SetInputBufferTypeToRGBA() { this->SetInputBufferType(VTK_RGBA); }
void SetInputBufferTypeToZBuffer() { this->SetInputBufferType(VTK_ZBUFFER); }
一般分为三种:VTK_RGB/VTK_RGBA/VTK_ZBUFFER;
VTK_RGB:表示从从窗口读取彩色图像,每个数值是3个字节;
VTK_RGBA:表示从从窗口读取彩色图像并包括alpha通道,每个数值是4个字节;
VTK_ZBUFFER:深度缓冲区,作为浮点数组返回;
默认值为:VTK_RGB;
设置InputBufferType类型后,决定了图像的组成;
vtkSmartPointer<vtkWindowToImageFilter> windowto_image_filter = vtkSmartPointer<vtkWindowToImageFilter>::New();
windowto_image_filter->SetInput(renderWindow);
windowto_image_filter->SetScale(1);
windowto_image_filter->SetInputBufferTypeToRGB();
windowto_image_filter->ReadFrontBufferOff();
windowto_image_filter->Update();
vtkSmartPointer<vtkImageData> tmp_vtk_data = windowto_image_filter->GetOutput();
char *data_ptr = reinterpret_cast<char*>(tmp_vtk_data->GetScalarPointer());
data_ptr 指向内存块的长度,与InputBufferType有关系;如果没有正确解读,就会出现内存越界的情况;
设置从那个缓冲区读取
vtkBooleanMacro(ReadFrontBuffer, vtkTypeBool);
vtkTypeBool ReadFrontBuffer;
可以控制是否从前缓冲区读取;默认是从前缓冲区读取;
外部可以使用ReadFrontBufferOff关闭;
示例
将当前窗口的图像保存为2D图像
vtkSmartPointer<vtkWindowToImageFilter> windowto_image_filter = vtkSmartPointer<vtkWindowToImageFilter>::New();
windowto_image_filter->SetInput(renderWindow);
windowto_image_filter->SetScale(1);
windowto_image_filter->SetInputBufferTypeToRGB();
windowto_image_filter->ReadFrontBufferOff();
windowto_image_filter->Update();
vtkSmartPointer<vtkBMPWriter> writer = vtkSmartPointer<vtkBMPWriter>::New();
writer->SetFileName(out_filename.c_str());
writer->SetInputConnection(windowto_image_filter->GetOutputPort());
writer->Write();
例子
下面使用一个例子,打开一个stl文件,将渲染后的截图保持成bmp格式,放在E盘的根目录下;
代码
#include "pch.h"
#include <iostream>
#include "vtkPolyDataMapper.h"
#include "vtkLODActor.h"
#include "vtkCamera.h"
#include "vtkProperty.h"
#include "vtkSTLReader.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkWindowToImageFilter.h"
#include "vtkBMPWriter.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
vtkSTLReader* part = vtkSTLReader::New();
part->SetFileName("E:\\out.stl");
vtkPolyDataMapper* partMapper = vtkPolyDataMapper::New();
partMapper->SetInputConnection(part->GetOutputPort());
vtkLODActor* partActor = vtkLODActor::New();
partActor->SetMapper(partMapper);
partActor->GetProperty()->SetColor(0.8275, 0.8275, 0.8275);
partActor->RotateX(30.0);
partActor->RotateY(-45.0);
vtkRenderer* ren1 = vtkRenderer::New();
ren1->AddActor(partActor);
ren1->SetBackground(0.1, 0.2, 0.4);
ren1->ResetCamera();
ren1->GetActiveCamera()->Zoom(1.5);
vtkRenderWindow* renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(200, 200);
renWin->OffScreenRenderingOn();
renWin->Render();
vtkSmartPointer<vtkWindowToImageFilter> windowto_image_filter = vtkSmartPointer<vtkWindowToImageFilter>::New();
windowto_image_filter->SetInput(renWin);
windowto_image_filter->SetScale(1);
windowto_image_filter->SetInputBufferTypeToRGB();
windowto_image_filter->ReadFrontBufferOff();
windowto_image_filter->Update();
vtkSmartPointer<vtkBMPWriter> writer = vtkSmartPointer<vtkBMPWriter>::New();
writer->SetFileName("E:\\out.bmp");
writer->SetInputConnection(windowto_image_filter->GetOutputPort());
writer->Write();
system("pause");
return 0;
}
运行效果
保存后的图片为: