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、属性、变换矩阵等信息写入文件中,或者从外部文件中将这些对象导入渲染场景中,一般所导入的文件含有多个数据集。