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、屬性、變換矩陣等信息寫入文件中,或者從外部文件中將這些對象導入渲染場景中,一般所導入的文件含有多個數據集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章