4.1 Reader與Writer類
VTK提供不同的Reader/Writer類讀寫各種文件,對於類的使用者而言,最重要的是根據不同的文件類型選擇合適的Reader/Writer類進行讀寫操作
4.1.1 vtkImageData類型
類vtkDicomImageReader可用於讀取DICOM圖像,DICOM(*.dcm)圖像是醫學圖像處理中使用最廣泛的格式,但該類功能很不完善。該類不支持多幀DICOM圖像的讀取,VTK也沒有實現對DICOM圖像的寫操作。對DICOM圖像的讀寫支持較好的函數庫主要有GDCM和DCMTK。DCMTK是目前對DICOM協議支持最全的工具包,同時也是讀寫DICOM圖像的專業函數庫。
1. 讀寫單個圖像文件
vtkImageReader2主要針對二維圖像(特別是醫學圖像)顯示設計的,實現了圖像縮放、旋轉、平移、窗寬窗位調節等功能;除了可以用於單幅二維圖像的顯示之外,也可以顯示三維圖像的摸個切片,還可以設置不同的顯示方向。
///****************************************************/
///* Examples/Chap04/4.1_ReadWriteSingleImage.cpp */
///****************************************************/
#include <vtkSmartPointer.h>
#include <vtkPNGReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkJPEGWriter.h>
int main() {
// 讀取PNG圖像
vtkSmartPointer<vtkPNGReader> reader =
vtkSmartPointer<vtkPNGReader>::New();
reader->SetFileName("D:\\1.png");
// 顯示讀取的單幅PNG圖像
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetupInteractor(interactor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
//imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();
// 保存成JPG
vtkSmartPointer<vtkJPEGWriter> writer =
vtkSmartPointer<vtkJPEGWriter>::New();
writer->SetFileName("VTK-logo.jpg");
writer->SetInputConnection(reader->GetOutputPort());
writer->Write();
interactor->Start();
return 0;
}
2.讀取序列圖像文件
///****************************************************/
///* Examples/Chap04/4.1_ReadSeriesImage.cpp */
///****************************************************/
#include <vtkSmartPointer.h>
#include <vtkStringArray.h>
#include <vtkStdString.h>
#include <vtkJPEGReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkJPEGWriter.h>
int main() {
// 生成圖像序列的文件名數組
vtkSmartPointer<vtkStringArray> fileArray =
vtkSmartPointer<vtkStringArray>::New();
char fileName[128];
for (int i = 0; i < 100; i++)
{
sprintf(fileName, "D://data//Head/head%03d.jpg", i);
vtkStdString::StdString fileStr(fileName);
fileArray->InsertNextValue(fileStr);
}
// 讀取JPG序列圖像
vtkSmartPointer<vtkJPEGReader> reader =
vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileNames(fileArray);
// 顯示讀取的單幅PNG圖像
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetSlice(50); //默認顯示第50個切片(即第50層)
imageViewer->SetSliceOrientationToXY();
/*imageViewer->SetSliceOrientationToYZ();
imageViewer->SetSliceOrientationToXZ();*/
imageViewer->SetupInteractor(interactor);
imageViewer->Render();
interactor->Start();
return 0;
}
4.1.2 vtkPolyData類型
4.1.3 vtkRectilinearGrid類型
4.1.4 vtkStructuredGrid類型
4.1.5 vtkUnstructuredGrid類型
4.2場景的導入與導出
場景的導入與導出是指將渲染場景中的對象,包括光照、相機、Actor、屬性、變換矩陣等信息寫入文件中,或者從外部文件中將這些對象導入渲染場景中,一般所導入的文件含有多個數據集。