vtk讀取檔案並顯示的幾種方法
阿新 • • 發佈:2019-02-14
1.用vtkDICOMImageReader
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h" #include "vtkImageActor.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageShiftScale.h"
int main ()
{
vtkDICOMImageReader *dcmReader = vtkDICOMImageReader::New();
dcmReader->SetDirectoryName("E:\medicalimages\vhm");
dcmReader->SetDataByteOrderToLittleEndian();
double x,y,z;
dcmReader->GetDataSpacing(x,y,z);
dcmReader->SetDataSpacing(x,y,z); vtkImageShiftScale *shifter =vtkImageShiftScale::New();
shifter->SetInputConnection(dcmReader->GetOutputPort());
shifter->SetShift(70);
shifter->SetScale(0.5);
shifter->SetOutputScalarTypeToUnsignedChar(); vtkImageActor *actor =vtkImageActor::New();
actor->SetInput(shifter->GetOutput()); vtkRenderer *aRender = vtkRenderer::New();//設定繪製類
aRender->AddActor(actor); vtkRenderWindow*renWin=vtkRenderWindow::New();//設定繪製視窗
renWin->SetSize(500, 500);//設定背景顏色和繪製視窗大小
renWin->AddRenderer(aRender);//裝載繪製類 vtkRenderWindowInteractor*iRen=vtkRenderWindowInteractor::New();//設定繪製視窗的互動
iRen->SetRenderWindow(renWin);//裝載繪製視窗
renWin->Render();//視窗進行繪製
iRen->Initialize();
iRen->Start(); //初始化並進行互動繪製 dcmReader->Delete();
shifter->Delete();
actor->Delete();
aRender->Delete();
renWin->Delete();
iRen->Delete();
return 0;
}
2.用vtkVolume16Reader,不限定DCM檔案,不過檔案字尾要以.1 .2.3...來命名,工作有得做,而且不能讀太多圖片,vtkArray承載不了太多資料.而且圖片會錯位
vtkVolume16Readerv16 = new vtkVolume16Reader();
v16.SetDataDimensions(512,512);
v16.SetDataByteOrderToLittleEndian();
v16.SetFilePrefix("F:\LiverGUI\SE4\IM");
v16.SetImageRange(1,100);
v16.SetDataSpacing(1.0,1.0, 1.0);
3.讀raw data...用vtkImageData,讀取用vtkImageReader更快!具體查vtk手冊吧!
private void volumeRendering(String filePath, int[] dims, int[]shrinkFactor,vtkRenderWindow renWin)
{
//介面說明
//1.filePath:dat檔名
//2.dims:體資料的三個維度所構成的陣列
//3.shrinkFactor:三個元素的陣列,代表長寬 高 的縮放比例
//4.vtkRenderWindow,視窗中新增的vtkFormsWindowControl通過GetRenderWindow方法獲得的變數
//Readdat data
FileStreamfs = null;
byte[]point = new byte[2];
if(!File.Exists(filePath))
{
MessageBox.Show("RawData doesn't exist!");
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h" #include "vtkImageActor.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageShiftScale.h"
int main ()
{
vtkDICOMImageReader *dcmReader = vtkDICOMImageReader::New();
dcmReader->SetDirectoryName("E:\medicalimages\vhm");
dcmReader->SetDataByteOrderToLittleEndian();
double x,y,z;
dcmReader->GetDataSpacing(x,y,z);
dcmReader->SetDataSpacing(x,y,z); vtkImageShiftScale *shifter =vtkImageShiftScale::New();
shifter->SetInputConnection(dcmReader->GetOutputPort());
shifter->SetShift(70);
shifter->SetScale(0.5);
shifter->SetOutputScalarTypeToUnsignedChar(); vtkImageActor *actor =vtkImageActor::New();
actor->SetInput(shifter->GetOutput()); vtkRenderer *aRender = vtkRenderer::New();//設定繪製類
aRender->AddActor(actor); vtkRenderWindow*renWin=vtkRenderWindow::New();//設定繪製視窗
renWin->SetSize(500, 500);//設定背景顏色和繪製視窗大小
renWin->AddRenderer(aRender);//裝載繪製類 vtkRenderWindowInteractor*iRen=vtkRenderWindowInteractor::New();//設定繪製視窗的互動
iRen->SetRenderWindow(renWin);//裝載繪製視窗
renWin->Render();//視窗進行繪製
iRen->Initialize();
iRen->Start(); //初始化並進行互動繪製 dcmReader->Delete();
shifter->Delete();
actor->Delete();
aRender->Delete();
renWin->Delete();
iRen->Delete();
return 0;
}
2.用vtkVolume16Reader,不限定DCM檔案,不過檔案字尾要以.1 .2.3...來命名,工作有得做,而且不能讀太多圖片,vtkArray承載不了太多資料.而且圖片會錯位
vtkVolume16Readerv16 = new vtkVolume16Reader();
v16.SetDataDimensions(512,512);
v16.SetDataByteOrderToLittleEndian();
v16.SetFilePrefix("F:\LiverGUI\SE4\IM");
v16.SetImageRange(1,100);
v16.SetDataSpacing(1.0,1.0, 1.0);
3.讀raw data...用vtkImageData,讀取用vtkImageReader更快!具體查vtk手冊吧!
private void volumeRendering(String filePath, int[] dims, int[]shrinkFactor,vtkRenderWindow renWin)
{
//介面說明
//1.filePath:dat檔名
//2.dims:體資料的三個維度所構成的陣列
//3.shrinkFactor:三個元素的陣列,代表長寬 高 的縮放比例
//4.vtkRenderWindow,視窗中新增的vtkFormsWindowControl通過GetRenderWindow方法獲得的變數
//Readdat data
FileStreamfs = null;
byte[]point = new byte[2];
if(!File.Exists(filePath))
{
MessageBox.Show("RawData doesn't exist!");