我有一个程序,它以RGB格式给我一个2D数组颜色数据。
我想创建一个可以显示像素颜色的窗口或其他东西。我有一个Qt应用程序有一个Qlabel。
如何使用QLabel的功能(例如QPixmap)从文件中获取颜色数据并将其显示在QLabel上?
任何人都可以建议我做这件事,也请提供资源链接。
更新: Actualy我的另一个程序生成的颜色数据同样是图像,所以我想要一种在Qt应用程序中实时显示的方法。
答案 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
。