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。
我通过在 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。