将dip::Image 转换为QImage

问题描述 投票:0回答:1

我想在Qt框架中为我的项目使用DIPlip库来显示DIPlib图像的结果我需要将

dip::Image
类转换为Qt框架
QImage
类,格式为
QImage::Format_RGB888

如何将 C++ 语言中的灰度图像 DIPlib

dip::Image
转换为
QImage

c++ qt qimage diplib
1个回答
0
投票

Qt 的

QImage::Format_RGB888
与 DIPlib 存储兼容,据我从其 文档 得知。因此,有两种方法可以在这些库之间共享数据:

  1. 创建一个拥有数据的

    QImage
    对象,然后创建一个封装该数据的
    dip::Image
    对象。

  2. 创建一个拥有数据的

    dip::Image
    对象,然后创建一个封装该数据的
    QImage
    对象。

在这两种情况下,您需要确保在使用另一个对象时使第一个对象(拥有数据的对象)保持活动状态。

将 Qt 图像数据封装在
dip::Image
对象中

dip::Image
有一个构造函数(documentation),它将指向像素数据和大小的指针作为输入。据我了解 Qt 如何存储像素数据,这个足以与 Qt 一起使用。有 更复杂版本的构造函数 可以处理其他像素存储约定。

QImage qt_image(800, 600, QImage::Format::Format_RGB888);

dip::Image dip_image(qt_image.constBits(), {qt_image.width(), qt_image.height()}, 3);  // You might need to explicitly cast the width and height values to dip::uint or std::size_t
dip_image.Protect();  // prevents the image from being reallocated

您现在可以使用任何 DIPlib 函数写入

dip_image
(只要它们接受 3 通道输出),
qt_image
也会更新。

将 DIPlib 图像数据封装在
QImage
对象中

QImage
有一个构造函数(documentation),它将指向像素数据以及大小和格式的指针作为输入。只要选择的格式与 DIPlib 图像使用的表示形式相匹配,我们就可以将 DIPlib 图像数据封装在
QImage
中。

dip::Image dip_image({800, 600}, 3, dip::DT_UINT8);
// put data into dip_image...

QImage::QImage qt_image(static_cast<uchar*>(dip_image.Origin()), dip_image.Size(0), dip_image.Size(1), QImage::Format::Format_RGB888);

您现在可以显示

qt_image
,用户将在
dip_image
中看到图像。修改其中一个也会修改另一个,因为它们正在共享数据。

© www.soinside.com 2019 - 2024. All rights reserved.