使用vtkImageViewer2展示一个QImage(2D图像);
Qt5.12.7
vtk-9.2
下面不是直接能用的代码,是使用方法、使用流程;怎么用还得看自己需求。
//VTK 在QT中的渲染窗口部件(QT与VTK 在此被链接)
OpenGLNativeWidget = vtkSmartPointer<QVTKOpenGLNativeWidget>::New();
m_pImageViewer = vtkSmartPointer<vtkImageViewer2>::New();
m_pImageImport = vtkSmartPointer<vtkImageImport>::New(); //图像数据读取器
m_pImageData = vtkSmartPointer<vtkImageData>::New();
//初始化交互器
m_pImageViewer->SetupInteractor(OpenGLNativeWidget->interactor());
//初始化渲染窗口
m_pImageViewer->SetRenderWindow(OpenGLNativeWidget->renderWindow());
//给渲染窗口添加场景
OpenGLNativeWidget->renderWindow()->AddRenderer(m_pImageViewer->GetRenderer());
//背景颜色
m_pImageViewer->GetRenderer()->SetBackground(0, 0, 0);
//交互样式
m_pStyle = vtkSmartPointer<vtkInteractorStyleImage>::New();
OpenGLNativeWidget->interactor()->SetInteractorStyle(m_pStyle);
//渲染
m_pImageViewer->GetRenderer()->ResetCamera();
图像的转换(读取)
读取格式需要按需求调整
//deepCopy 是否让vtk深度拷贝图像数据
void DisplayQImage(QImage& qimage, bool deepCopy = false)
{
m_pImageImport->SetDataSpacing(1, 1, 1);//像素间距
m_pImageImport->SetDataOrigin(0, 0, 0);//坐标原点
m_pImageImport->SetWholeExtent(0, qimage.width() - 1, 0, qimage.height() - 1, 0, 0);//整体范围 X轴最小值,X轴最大值,Y轴最小值,Y轴最大值,Z轴最小值,Z轴最大值
m_pImageImport->SetDataExtentToWholeExtent();//数据范围
m_pImageImport->SetDataScalarTypeToUnsignedChar();//标量类型;每个元组内组分类型
m_pImageImport->SetNumberOfScalarComponents(qimage.depth() / 8);//元组内组分个数 //[Format_RGB32] ==> 32 / 8 = 4
if(deepCopy)
{
m_pImageImport->CopyImportVoidPointer(qimage.bits(), qimage.byteCount());//复制输入图片数据
}
else
{
m_pImageImport->SetImportVoidPointer(qimage.bits());//使用图像内存指针
}
//vtkImageFlip 用于图像的旋转
//vtkNew<vtkImageFlip> flip;
//flip->SetInputConnection(m_pImageImport->GetOutputPort());
//flip->SetFilteredAxes(1);
m_pImageImport->Update();
DisplayVtkImageData(m_pImageImport->GetOutput());
}
void DisplayVtkImageData(vtkSmartPointer<vtkImageData> imageData)
{
m_pImageData = imageData
m_pImageViewer->SetInputData(m_pImageData);
m_pImageViewer->Modified();
}