本文由Markdown语法编辑器编辑完成。
1. 背景:
在医疗软件的开发中,QT和VTK是经常配合使用的。基于QT,可以快速地搭建出软件的图像窗口、按钮、工具栏和状态栏;基于VTK(还有DCMTK,ITK等),则可以实现医学图像的基本读取和处理。VTK的渲染窗口是其内部的一个类vtkRenderWindow,响应鼠标事件是通过vtkRenderWindowInteractor。
那么如何实现将基于VTK渲染在vtkRenderWindow中的图像显示在QT的控件(QWidget, QImage,QLabel等)中呢。
这里介绍两种思路。
2. QT与VTK联合显示图像:
2.1 借助QVTKWidget:
2.2 图像按字节拷贝:
这种方法的基本思路是:在内存中创建一套VTK渲染图像的管道机制,但是使vtkRenderWindow不显示,只是存在于内存中。当图像渲染完毕后,将vtkRenderWindow中的图像通过filter,截取出来,然后再按字节逐一拷贝到提前创建好的QImage中。
vtkSmartPointer<vtkRenderWindow> m_spRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
m_spRenderWindow->OffScreenRenderingOn();
vtkSmartPointer<vtkScalarsToColors> = m_spLookupTable = vtkSmartPointer<vtkScalarsToColors>::New();
vtkSmartPointer<vtkRenderer> m_spRenderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkImageMapToColors> m_spImageMapToColors = vtkSmartPointer<vtkImageMapToColors>::New();
m_spImageMapToColors->SetInputData(m_spImage);
m_spImageMapToColors->SetLookupTable(m_spLookupTable);
vtkSmartPointer<vtkImageActor> m_spImageActor =
vtkSmartPointer<vtkImageActor>::New();
m_spImageActor->GetMapper()->SetInputConnection(m_spImageMapToColors->GetOutputPort());
m_spRenderer->GetActiveCamera()->ParallelProjectionOn();
m_spRenderer->AddActor(m_spImageActor);
m_spRenderWindow->AddRenderer(m_spRenderer);
m_spRenderWindow->Render();
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInput(m_spRenderWindow);
windowToImageFilter->SetInputBufferTypeToRGBA();
windowToImageFilter->Update();
vtkImageData *output=windowToImageFilter->GetOutput();
DxImageExtent extent;
output->GetExtent(extent.GetPointer());
void *startPointer=output->GetScalarPointer(extent.XMin(),extent.YMin(),extent.ZMin());
QImage m_displayImage;
memcpy(m_displayImage.bits(),startPointer,m_displayImage.byteCount());
m_displayImage=m_displayImage.rgbSwapped();
未完待续……