我在c#内存中存储了一个卷作为切片。切片在内存中可能不连续。我想导入此数据并创建一个vtkImageData对象。
我找到的第一种方法是使用vtkImageImporter,但是这个导入器只接受一个void指针作为数据输入。由于我的切片在内存中可能不连续,因此我无法将单个指针传递给切片数据。
第二个选项是从头创建vtkImageData并使用vtkImageData-> GetScalarPointer()“来获取指向其数据的指针。然后使用循环填充它。这是非常昂贵的(虽然memcpy可以加快速度我也可以将复制方法与vtkImageImport ofcourse结合起来。
这些是我唯一的选择,还是有更好的方法将数据导入vtk对象?我想确保在采用复制方法之前没有其他选择(性能很重),或者修改我的切片的低级存储,使它们在内存中连续存在。
答案 0 :(得分:2)
我不太熟悉VTK for C#(ActiViz)。在C ++中使用vtkImageData-> GetScalarPointer()并手动复制切片是一种很好的方法。如你所说,它将首先增加存储所有内存的速度,也许你想以更强大的方式(更改数字)来实现它:
vtkImageData * img = vtkImageData::New();
img->SetExtent(0, 255, 0, 255, 0, 9);
img->SetSpacing(sx , sy, sz);
img->SetOrigin(ox, oy, oz);
img->SetNumberOfScalarComponents(1);
img->SetScalarTypeToFloat();
img->AllocateScalars();
然后不要做类似的事情:
float * fp = static_cast<float *>(img->GetScalarPointer());
for ( int i = 0; i < 256* 256* 10; i ++) {
fp[i] = mydata[i]
}
另一个更好的选择是根据vtkImageImport中的代码创建自己的vtkImporter。