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;

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;

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

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。