一般图像数据都是以RGBRGBRGB……字节流的方式(解码完成后的原始图像流),我说成字节流,那就表明R,G,B的值各占一个字节,在编程时表示的就是unsigned char * data。

我们先来看一下QT中的QImage对象。在加载data数据前,我们要确定QImage加载图像的空间分配足够大,先假设data是由640*480像素的压缩数据解码得来的,RGB(3字节)是一个像素,故data的应该是640*480*3个字节;比较一下下面两种方式:

       QImage img(640,480,QImage::Format_RGB888);//24位
        unsigned char * p_bits=img.bits();

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

        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
    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();

另一种方式:

       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个字节。所以应该这样写:

        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
    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. Javascript原型模式总结梳理
  2. WinForm动态添加控件及其事件(转)
  3. js返回上一步
  4. zabbix 2.2.2在centos 6.3 x86_64上的安装
  5. c#中的linq二
  6. VB6 仿.netWinfrom控件 Anchor属性类
  7. [cocos2d-js]chipmunk例子(一)
  8. IIs站点的建立
  9. netty httpserver
  10. Java语言基本语法
  11. Maven初识
  12. POJ3253 Fence Repair(贪心)
  13. 网络协议——IP
  14. IDEA下Spring Boot的快速搭建
  15. 解决tcp粘包问题
  16. select非group by字段的方法
  17. sax 动态切换 抓取感兴趣的内容(把element当做documnet 处理)
  18. 【python38--面向对象继承】
  19. std::thread中获取当前线程的系统id
  20. post get 区别

热门文章

  1. 浅谈java虚拟机|系列1|架构简介
  2. 前端批量迁移NAS存储
  3. 微服务中的rpc 请求写法
  4. js时间转时间戳
  5. 基础习题1——print
  6. oracle基本语句(第四章、数据库安全管理)
  7. WinServer2008R2远程桌面长时间保持连接
  8. LeetCode - 滑动窗口最大值
  9. 在vue中结合render函数渲染指定的组件到容器中
  10. option跳转页面并选中当前值