我想在Qt框架中为我的项目使用DIPlip库来显示DIPlib图像的结果我需要将
dip::Image
类转换为Qt框架QImage
类,格式为QImage::Format_RGB888
。
如何将 C++ 语言中的灰度图像 DIPlib
dip::Image
转换为 QImage
?
Qt 的
QImage::Format_RGB888
与 DIPlib 存储兼容,据我从其 文档 得知。因此,有两种方法可以在这些库之间共享数据:
创建一个拥有数据的
QImage
对象,然后创建一个封装该数据的 dip::Image
对象。
创建一个拥有数据的
dip::Image
对象,然后创建一个封装该数据的 QImage
对象。
在这两种情况下,您需要确保在使用另一个对象时使第一个对象(拥有数据的对象)保持活动状态。
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
也会更新。
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
中看到图像。修改其中一个也会修改另一个,因为它们正在共享数据。