如何在QLabel中将颜色数据放在像素中?

时间:2017-11-08 09:59:11

标签: c++ qt

我有一个程序,它以RGB格式给我一个2D数组颜色数据。

我想创建一个可以显示像素颜色的窗口或其他东西。我有一个Qt应用程序有一个Qlabel。

如何使用QLabel的功能(例如QPixmap)从文件中获取颜色数据并将其显示在QLabel上?

任何人都可以建议我做这件事,也请提供资源链接。

更新: Actualy我的另一个程序生成的颜色数据同样是图像,所以我想要一种在Qt应用程序中实时显示的方法。

2 个答案:

答案 0 :(得分:2)

使用 Qlabel 编写尺寸大于500 x 500像素的图片会影响程序的性能。我建议你使用 QImage 直接访问像素:

int height = 720;
int width = 1280;
size_t arrayIndex = 0;

QImage  image(height, width, QImage::Format_RGBA8888);

for (int x = 0; x < height; x++) {
    for (int y = 0; y < width; y++) {
        QRgb value = qRgb(your_RGB_Array[arrayIndex++], your_RGB_Array[arrayIndex++], your_RGB_Array[arrayIndex++]);
        image.setPixel(x, y, value);
    }
}

答案 1 :(得分:1)

您应首先创建QImage,然后在QLabel上使用它。

const size_t width  = ...
const size_t height = ...
QImage image(width, height, QImage::Format_RGB888);

您现在可以使用两个for循环和QImage::setPixel逐个设置这些像素。然而,这有点慢。更好的方法是将2D数组转换为1D数组并使用QImage的适当构造函数。

例如:

pixel_t **2d_array = ...
pixel_t  *array = new pixel_t[width * height * sizeof(pixel_t)];

for(size_t h = 0; h < height; ++h){
    memcpy(array + h * width, 2d_array[h], width);
}

// Create image
QImage image{array, width, height, QImage::Format_RGB888};

pixel_t可能是:

struct pixel_t {
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

注意:

  • 如果使用该构造函数,则不应释放array的内存(请注意,QImage的副本构造和副本分配不会复制其内存,因此仍应保留内存)
  • 如果您想在构建QImage后释放内存,则应先创建一个空的QImage,然后将其填入QImage::loadFromData
  • 对于现成的图片,请使用QPixmap