天天看點

VTK筆記-将渲染視窗儲存成圖像-vtkWindowToImageFilter類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+開始,由于這些依賴關系,獨立于機器的行為不能自動得到保證。

VTK筆記-将渲染視窗儲存成圖像-vtkWindowToImageFilter類vtkWindowToImageFilter示例參考文獻

主要接口

設定輸入

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

運作效果

儲存後的圖檔為:

VTK筆記-将渲染視窗儲存成圖像-vtkWindowToImageFilter類vtkWindowToImageFilter示例參考文獻

參考文獻

1.vtkWindowToImageFilter Class Reference

繼續閱讀