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+開始,由于這些依賴關系,獨立于機器的行為不能自動得到保證。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygjN2ITM0gTM2ETNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
主要接口
設定輸入
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