QT中显示图像数据

https://www.cnblogs.com/flyinggod/p/8721243.html

采男孩的小蘑菇

一般图像数据都是以RGBRGBRGB……字节流的方式(解码完成后的原始图像流),我说成字节流,那就表明R,G,B的值各占一个字节,在编程时表示的就是unsigned char * data。我们先来看一下QT中的QImage对象。在加载data数据前,我们要确定QImage加载图像的空间分配足够大,先假设data是由640*480像素的压缩数据解码得来的,RGB(3字节)是一个像素,故data的应该是640*480*3个字节;比较一下下面两种方式:

1

2

QImage img(640,480,QImage::Format_RGB888);

unsigned char * p_bits = img.bits();

24位(3字节)一个像素,那么p_bits所得到的空间应该是640*480*3个字节,所以刚刚好一个字节对一个字节。所以我们这样赋值即可:

1

2

3

4

5

6

for(int i=0;i<640*480*3;i+=3)

{

      puiBits[i]=data[i];

      puiBits[i+1]=data[i+1];

      puiBits[i+2]=data[i+2];

}

接着就是将img转化成QPixmap填充到QWidget

1

2

3

4

5

6

7

QPixmap pixmap=QPixmap::fromImage(img);

pixmap=pixmap.scaled(widget->size());

widget->setAutoFillBackground(true);

QPalette palette;

palette.setBrush(widget->backgroundRole(), QBrush(pixmap));

widget->setPalette(palette);

widget->repaint();

第二种方式

1

2

3

unsigned int * p_bits;

QImage img(640,480,QImage::Format_RGB32);

p_bits=(uint*)img.bits();

32位(4字节)一个像素,那么p_bits所得到的空间应该是640*480*4个字节,所以不能以上面的方式赋值。有没有注意到,这里用了unsigned int而不用unsigned char;unsigned int是4个字节的,unsigned char 是1个字节的,所以我们这里做的事情是将每一个RGB单元放到p_bits的每个unsigned int(4字节)中。因为p_bits是unsigned int指针,所以p_bits[i]就是4个字节。所以应该这样写:

1

2

3

4

for(int i=0;i<640*480*3;i+=3)

{

     p_bits[i/3]=qRgb(data[i],data[i+1],data[i+2]);

}

接着就是将img转化成QPixmap填充到QWidget

1

2

3

4

5

6

7

QPixmap pixmap=QPixmap::fromImage(img);

pixmap=pixmap.scaled(widget->size());

widget->setAutoFillBackground(true);

QPalette palette;

palette.setBrush(widget->backgroundRole(), QBrush(pixmap));

widget->setPalette(palette);

widget->repaint();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值