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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值