VTK笔记-将渲染窗口保存成图像-vtkWindowToImageFilter类

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;
}

运行效果

保存后的图片为:
在这里插入图片描述

参考文献

1.vtkWindowToImageFilter Class Reference

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值