1.用vtkDICOMImageReader
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteracto
r.h"
#include "vtkImageActor.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageShiftScale.h"
int main ()
{
vtkDICOMImageReader *dcmReader = vtkDICOMImageReader::New();
dcmReader->SetDirectoryName("E:\medicalimages\vhm");
dcmReader->SetDataByteOrderToLittle
Endian();
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->SetOutputScalarTypeToUns
ignedChar();
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);//装载绘制类
vtkRenderWindowInteracto
r*iRen=vtkRenderWindowInteracto
r::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.SetDataByteOrderToLittle
Endian();
v16.SetFilePrefix("F:\LiverGUI\SE4\IM");
v16.SetImageRange(1,100);
v16.SetDataSpacing(1.0,1.0, 1.0);
3.读raw da
ta...用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 da
ta
FileStreamfs = null;
byte[]point = new byte[2];
if(!File.Exists(filePath))
{
MessageBox.Show("RawDa
ta doesn't exist!");
return;
}
fs= new FileStream(filePath, FileMode.Open, FileAccess.Read,FileShare.Read);
inti, j, k;
short[,,]rawData= new short[dims[0], dims[1], dims[2]];
for(i = 0; i < dims[0]; i++)
{
for(j = 0; j < dims[1]; j++)
{
for(k = 0; k < dims[2]; k++)
{
point[0]= (byte)fs.ReadByte();
point[1]= (byte)fs.ReadByte();
rawData
= BitConverter.ToInt16(point, 0);
}
}
}
//VolumeRendeing
vtkImageDataid = new vtkImageData();
id.SetDimensions(dims[0],dims[1], dims[2]);
id.SetScalarTypeToShort();
id.SetNumberOfScalarCompone
nts(1);
id.AllocateScalars();
vtkImageShrink3Dmask = new vtkImageShrink3D();
mask.SetInput(id);
mask.SetShrinkFactors(shrinkFactor[0],shrinkFactor[1], shrinkFactor[2]);
unsafe
{
short*a = (short*)(id.GetScalarPointer().ToPointer());
for(i = 0; i < dims[0]; i++)
{
for(j = 0; j < dims[1]; j++)
{
for(k = 0; k < dims[2]; k++)
{
*a++= rawData
;
}
}
}
}
vtkContourFiltercf = new vtkContourFilter();
cf.SetInputConnection(mask.GetOutputPort());
vtkPolyDataMappermapper = new vtkPolyDataMapper();
mapper.SetInputConnection(cf.GetOutputPort());
mapper.SetScalarRange(-2048,2047);
vtkActoractor = new vtkActor();
actor.SetMapper(mapper);
vtkCameraaCamera = new vtkCamera();
aCamera.SetViewUp(0,5, 0);
aCamera.SetPosition(5,0, 0);
aCamera.SetFocalPoint(0,0, 0);
aCamera.ComputeViewPlaneNormal();
vtkRendererren = new vtkRenderer();
ren.AddActor(actor);
ren.ResetCamera();
aCamera.Dolly(1.5);
ren.ResetCameraClippingRange
();
renWin.AddRenderer(ren);
ren.SetBackground(0.0f,0.0f, 0.0f);
}
}