2.用vtkVolume16Reader,不限定DCM文件,不过文件后缀要以.1 .2 .3...来命名,工作有得做,而且不能读太多图片,vtkArray承载不了太多数据.而且图片会错位
vtkVolume16Reader v16 = 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方法获得的变量
//Read dat da
ta
FileStream fs = null;
byte[] point = new byte[2];
if (!File.Exists(filePath))
{
MessageBox.Show("Raw Da
ta doesn't exist!");
return;
}
fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
int i, 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);
}
}
}
//Volume Rendeing
vtkImageData id = new vtkImageData();
id.SetDimensions(dims[0], dims[1], dims[2]);
id.SetScalarTypeToShort();
id.SetNumberOfScalarCompone
nts(1);
id.AllocateScalars();
vtkImageShrink3D mask = 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
;
}
}
}
}
vtkContourFilter cf = new vtkContourFilter();
cf.SetInputConnection(mask.GetOutputPort());
vtkPolyDataMapper mapper = new vtkPolyDataMapper();
mapper.SetInputConnection(cf.GetOutputPort());
mapper.SetScalarRange(-2048, 2047);
vtkActor actor = new vtkActor();
actor.SetMapper(mapper);
vtkCamera aCamera = new vtkCamera();
aCamera.SetViewUp(0, 5, 0);
aCamera.SetPosition(5, 0, 0);
aCamera.SetFocalPoint(0, 0, 0);
aCamera.ComputeViewPlaneNormal();
vtkRenderer ren = new vtkRenderer();
ren.AddActor(actor);
ren.ResetCamera();
aCamera.Dolly(1.5);
ren.ResetCameraClippingRange
();
renWin.AddRenderer(ren);
ren.SetBackground(0.0f, 0.0f, 0.0f);
}