VTK图形图像开发进阶-学习笔记 04 VTK数据的读写

    技术2022-07-11  110

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

    Processed: 0.009, SQL: 9