繁体   English   中英

QImage 16 位灰度与 QQuickPaintedItem

[英]QImage 16 bit grayscale with QQuickPaintedItem

我通过在 Qt 5.12.3 中子类化 QQuickPaintedItem 显示了未签名的 16 位图像数据。 我将 QImage 与 Format_RGB32 一起使用,并将数据从 [0, 16383] 缩放到 [0, 255],并将其设置为所有三个 R、G、B 的颜色值。 现在,我正在使用 Qt 5.15.2,它有一个我想使用的 QImage FORMAT_GrayScale16,但由于某种原因图像显示不正确。 我用来将两种格式的无符号 16 位图像数据转换为 QImage 的代码如下所示。 QQuickPaintedItem 是drawImage(window(), my_qimage); 我传递了从下面的代码返回的 QImage。 为什么新格式显示不正确?

Format_RGB32方法

QImage image(image_dim, QImage::Format_RGB32);
unsigned int pixel = 0;
for (uint16_t row = 0; row < nrow; row++) {
    uint *scanLine = reinterpret_cast<uint *>(image.scanLine(row));
    for (uint16_t col = 0; col < ncols; col++) {
        uint16_t value = xray_image.data()[pixel++]; // Get each pixel
        unsigned short color_value = uint16_t((float(value) / 16383) * 255.0f); // scale [0, 255]
        *scanLine++ = qRgb(int(color_value), int(color_value), int(color_value));
    }
}
return image;

格式_RGB32

Format_Grayscale16 方法

QImage image(image_dim, QImage::Format_Grayscale16);
unsigned int pixel = 0;
for (uint16_t row = 0; row < nrow; row++) {
    // **EDIT WRONG:** uint *scanLine = reinterpret_cast<uint *>(image.scanLine(row));
    uint16_t *scanLine = reinterpret_cast<uint16_t *>(image.scanLine(row));
    for (uint16_t col = 0; col < ncols; col++) {
        *scanLine++ = xray_image.data()[pixel++]; // Get each pixel
    }
}
return image;

格式_Grayscale16

这对我有用(下面只是片段):

class Widget : public QWidget
{
private:
    QImage m_image;
    QImage m_newImage;
    QGraphicsScene *m_scene;
    QPixmap m_pixmap;
};
...
m_image.load("your/file/path/here");
m_newImage = m_image.convertToFormat(QImage::Format_Grayscale8);

m_pixmap.convertFromImage(m_newImage);
m_scene = new QGraphicsScene(this);
m_scene->addPixmap(m_pixmap);
m_scene->setSceneRect(m_pixmap.rect());

ui->graphicsView->setScene(m_scene);

根据您的 OP,您可能希望以不同的方式呈现它。 graphicsView 只是在设计模式中定义的 QGraphicsView。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM