Qt&Vtk-003-读取jpg、png、dicom等格式图片

举报
DreamLife 发表于 2022/04/15 22:58:31 2022/04/15
【摘要】 文章目录 Qt&Vtk 显示Jpg、Png、Tiff、Dicom、Bmp及3DCube1 简单介绍2 使用QVTKWidget3 功能实现3.1 JPG图片实现3.2 PNG图片实现3...

头图

Qt&Vtk 显示Jpg、Png、Tiff、Dicom、Bmp及3DCube

本文其实才能算是真正的Qt与Vtk结合,具体实现JPG、PNG、TIFF、DICOM、BMP及一个3D Cube显示。程序实际运行效果如下:

在这里插入图片描述

1 简单介绍

本文主要将在Qt中借助QvtkWidget来实现在Qt窗口中实现显示Jpg、Png、Tiff、Dicom、Bmp及3DCube等文件。如下图所示

在这里插入图片描述

2 使用QVTKWidget

在我们编译完成Vtk后,把***Bin\plugins\designer***下的***QVTKWidgetPlugin.dll***复制到Qt安装目录下的***Qt5.7.1\5.7\msvc2015_64\plugins\designer***,如下图所示

在这里插入图片描述

这样在Qt Designer中就可以看到对应的控件了,如下图

在这里插入图片描述

但是在Qt Creator中是无法使用的。碰巧了,我还不会用Designer。在Qt Creator不是不能用了,我们可以通过提升控件的方式来搞。如下图,我使用了8个widget来提升成QVTKwidget。

image-20210622095947304

到这里,基本就可以完事了,可以真正去写后面的功能了

3 功能实现

3.1 JPG图片实现

直接看代码吧,大致原理就是读取文件,建立渲染对象,选着窗口进行渲染。后面其他类型的图片也是这个套路。主要看代码吧,注释尽量忽略,我也不太懂图形学,都是按照自己的理解写的,凑合看。

void MainWindow::renderJpegImage(int index, const char *temp)
{
    /**
     * @brief 读取本地图片
     * 1. 获取本地资源地址
     * 2. 新建渲染对象
     * 3. 设置图像名称
     * 4. 更新
     */
    vtkSmartPointer<vtkJPEGReader> render = vtkSmartPointer<vtkJPEGReader>::New();
    render -> SetFileName(temp);
    render -> Update();
    /**
     * @brief 设置图片视图
     * 1. 新建视图
     * 2. 设置视图输入
     * 3. 设置视图窗口
     * 4. 视图渲染
     */
    vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
    viewer -> SetInputData(render -> GetOutput());
    switch (index) {
    case 1:
        viewer -> SetRenderWindow(ui->widget_VTK_1->GetRenderWindow());
        break;
    case 2:
        viewer -> SetRenderWindow(ui->widget_VTK_2->GetRenderWindow());
        break;
    case 3:
        viewer -> SetRenderWindow(ui->widget_VTK_3->GetRenderWindow());
        break;
    case 4:
        viewer -> SetRenderWindow(ui->widget_VTK_4->GetRenderWindow());
        break;
    case 5:
        viewer -> SetRenderWindow(ui->widget_VTK_5->GetRenderWindow());
        break;
    case 6:
        viewer -> SetRenderWindow(ui->widget_VTK_6->GetRenderWindow());
        break;
    case 7:
        viewer -> SetRenderWindow(ui->widget_VTK_7->GetRenderWindow());
        break;
    case 8:
        viewer -> SetRenderWindow(ui->widget_VTK_8->GetRenderWindow());
        break;
    default:
        break;
    }
    viewer -> Render();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

3.2 PNG图片实现

void MainWindow::renderPngImage(int index, const char *temp)
{
    /**
     * @brief 读取本地图片
     * 1. 获取本地资源地址
     * 2. 新建渲染对象
     * 3. 设置图像名称
     * 4. 更新
     */
    vtkSmartPointer<vtkPNGReader> render = vtkSmartPointer<vtkPNGReader>::New();
    render -> SetFileName(temp);
    render -> Update();
    /**
     * @brief 设置图片视图
     * 1. 新建视图
     * 2. 设置视图输入
     * 3. 设置视图窗口
     * 4. 视图渲染
     */
    vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
    viewer -> SetInputData(render -> GetOutput());
    switch (index) {
    case 1:
        viewer -> SetRenderWindow(ui->widget_VTK_1->GetRenderWindow());
        break;
    case 2:
        viewer -> SetRenderWindow(ui->widget_VTK_2->GetRenderWindow());
        break;
    case 3:
        viewer -> SetRenderWindow(ui->widget_VTK_3->GetRenderWindow());
        break;
    case 4:
        viewer -> SetRenderWindow(ui->widget_VTK_4->GetRenderWindow());
        break;
    case 5:
        viewer -> SetRenderWindow(ui->widget_VTK_5->GetRenderWindow());
        break;
    case 6:
        viewer -> SetRenderWindow(ui->widget_VTK_6->GetRenderWindow());
        break;
    case 7:
        viewer -> SetRenderWindow(ui->widget_VTK_7->GetRenderWindow());
        break;
    case 8:
        viewer -> SetRenderWindow(ui->widget_VTK_8->GetRenderWindow());
        break;
    default:
        break;
    }
    viewer -> Render();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

3.3 BMP图片实现

void MainWindow::renderBmprImage(int index, const char *temp)
{
    /**
     * @brief 读取本地图片
     * 1. 获取本地资源地址
     * 2. 新建渲染对象
     * 3. 设置图像名称
     * 4. 更新
     */
    vtkSmartPointer<vtkBMPReader> render = vtkSmartPointer<vtkBMPReader>::New();
    render -> SetFileName(temp);
    render -> Update();
    /**
     * @brief 设置图片视图
     * 1. 新建视图
     * 2. 设置视图输入
     * 3. 设置视图窗口
     * 4. 视图渲染
     */
    vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
    viewer -> SetInputData(render -> GetOutput());
    switch (index) {
    case 1:
        viewer -> SetRenderWindow(ui->widget_VTK_1->GetRenderWindow());
        break;
    case 2:
        viewer -> SetRenderWindow(ui->widget_VTK_2->GetRenderWindow());
        break;
    case 3:
        viewer -> SetRenderWindow(ui->widget_VTK_3->GetRenderWindow());
        break;
    case 4:
        viewer -> SetRenderWindow(ui->widget_VTK_4->GetRenderWindow());
        break;
    case 5:
        viewer -> SetRenderWindow(ui->widget_VTK_5->GetRenderWindow());
        break;
    case 6:
        viewer -> SetRenderWindow(ui->widget_VTK_6->GetRenderWindow());
        break;
    case 7:
        viewer -> SetRenderWindow(ui->widget_VTK_7->GetRenderWindow());
        break;
    case 8:
        viewer -> SetRenderWindow(ui->widget_VTK_8->GetRenderWindow());
        break;
    default:
        break;
    }
    viewer -> Render();

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

3.4 TIFF图片实现

void MainWindow::renderTiffImage(int index, const char *temp)
{
    /**
     * @brief 读取本地图片
     * 1. 获取本地资源地址
     * 2. 新建渲染对象
     * 3. 设置图像名称
     * 4. 更新
     */
    vtkSmartPointer<vtkTIFFReader> render = vtkSmartPointer<vtkTIFFReader>::New();
    render -> SetFileName(temp);
    render -> Update();
    /**
     * @brief 设置图片视图
     * 1. 新建视图
     * 2. 设置视图输入
     * 3. 设置视图窗口
     * 4. 视图渲染
     */
    vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
    viewer -> SetInputData(render -> GetOutput());
    switch (index) {
    case 1:
        viewer -> SetRenderWindow(ui->widget_VTK_1->GetRenderWindow());
        break;
    case 2:
        viewer -> SetRenderWindow(ui->widget_VTK_2->GetRenderWindow());
        break;
    case 3:
        viewer -> SetRenderWindow(ui->widget_VTK_3->GetRenderWindow());
        break;
    case 4:
        viewer -> SetRenderWindow(ui->widget_VTK_4->GetRenderWindow());
        break;
    case 5:
        viewer -> SetRenderWindow(ui->widget_VTK_5->GetRenderWindow());
        break;
    case 6:
        viewer -> SetRenderWindow(ui->widget_VTK_6->GetRenderWindow());
        break;
    case 7:
        viewer -> SetRenderWindow(ui->widget_VTK_7->GetRenderWindow());
        break;
    case 8:
        viewer -> SetRenderWindow(ui->widget_VTK_8->GetRenderWindow());
        break;
    default:
        break;
    }
    viewer -> Render();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

3.5 DICOM图片实现

void MainWindow::renderDicomImage(int index, const char *temp)
{
    /**
     * @brief 读取本地图片
     * 1. 获取本地资源地址
     * 2. 新建渲染对象
     * 3. 设置图像名称
     * 4. 更新
     */
    vtkSmartPointer<vtkDICOMImageReader> render = vtkSmartPointer<vtkDICOMImageReader>::New();
    render -> SetFileName(temp);
    render -> Update();
    /**
     * @brief 设置图片视图
     * 1. 新建视图
     * 2. 设置视图输入
     * 3. 设置视图窗口
     * 4. 视图渲染
     */
    vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
    viewer -> SetInputData(render -> GetOutput());
    switch (index) {
    case 1:
        viewer -> SetRenderWindow(ui->widget_VTK_1->GetRenderWindow());
        break;
    case 2:
        viewer -> SetRenderWindow(ui->widget_VTK_2->GetRenderWindow());
        break;
    case 3:
        viewer -> SetRenderWindow(ui->widget_VTK_3->GetRenderWindow());
        break;
    case 4:
        viewer -> SetRenderWindow(ui->widget_VTK_4->GetRenderWindow());
        break;
    case 5:
        viewer -> SetRenderWindow(ui->widget_VTK_5->GetRenderWindow());
        break;
    case 6:
        viewer -> SetRenderWindow(ui->widget_VTK_6->GetRenderWindow());
        break;
    case 7:
        viewer -> SetRenderWindow(ui->widget_VTK_7->GetRenderWindow());
        break;
    case 8:
        viewer -> SetRenderWindow(ui->widget_VTK_8->GetRenderWindow());
        break;
    default:
        break;
    }
    viewer -> Render();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

3.6 3D Cube实现

Cube基本就是照抄了官方的Demo

void MainWindow::drawVtkCube(int index)
{
    vtkNew <vtkNamedColors> colors;
    std::array<std::array<double, 3>, 8> pts = {{{{0, 0, 0}},
                                                 {{0.2, 0, 0}},
                                                 {{0.2, 0.2, 0}},
                                                 {{0, 0.2, 0}},
                                                 {{0, 0, 0.2}},
                                                 {{0.2, 0, 0.2}},
                                                 {{0.2, 0.2, 0.2}},
                                                 {{0, 0.2, 0.2}}}};
    std::array<std::array<vtkIdType,4>,6> ording = {{{{0, 1, 2, 3}},
                                                     {{4, 5, 6, 7}},
                                                     {{0, 1, 5, 4}},
                                                     {{1, 2, 6, 5}},
                                                     {{2, 3, 7, 6}},
                                                     {{3, 0, 4, 7}}}};
    vtkNew <vtkPolyData> cube;
    vtkNew <vtkPoints> points;
    vtkNew <vtkCellArray> polys;
    vtkNew <vtkFloatArray> scalars;
    for (auto i = 0ul;i < pts.size();++i)
    {
        points -> InsertPoint(i,pts[i].data());
        scalars -> InsertTuple1(i,i);
    }
    for (auto &&i : ording)
        polys -> InsertNextCell(vtkIdType(i.size()),i.data());
    cube -> SetPoints(points);
    cube -> SetPolys(polys);
    cube -> GetPointData() -> SetScalars(scalars);
    vtkNew<vtkPolyDataMapper> cubeMapper;
    cubeMapper->SetInputData(cube);
    cubeMapper->SetScalarRange(cube->GetScalarRange());
    vtkNew<vtkActor> cubeActor;
    cubeActor->SetMapper(cubeMapper);
    vtkNew<vtkCamera> camera;
    camera->SetPosition(1, 1, 1);
    camera->SetFocalPoint(0, 0, 0);
    vtkNew<vtkRenderer> render;
    render -> AddActor(cubeActor);
    render -> SetActiveCamera(camera);
    render -> SetBackground(colors -> GetColor3d("Cornsilk").GetData());
    ui->widget_VTK_6->GetRenderWindow()->AddRenderer(render);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

4 关闭VTK调试窗口

这里有小伙伴在运行的时候,可以能会发如下图的调试窗口存在

在这里插入图片描述

使用一行代码搞定,在main.cpp中加入*vtkOutputWindow::SetGlobalWarningDisplay(0);*即可,如下图

在这里插入图片描述

5 源码

在这里插入图片描述

这里就要有人问了呀,这么优秀的代码,能不能分享下呀,当然可以呀,我不生产代码,我只是代码的搬运工,链接如下:

自取:https://github.com/DreamLife-Jianwei/Qt-Vtk

在这里插入图片描述


博客签名2021


点赞

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/118635664

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。