Dragon  
Dragon
日历
<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 58
  • 文章 - 0
  • 评论 - 55
  • 引用 - 0

导航

常用链接

留言簿(3)

随笔分类(58)

随笔档案(58)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

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

       我们先来看一下QT中的QImage对象。在加载data数据前,我们要确定QImage加载图像的空间分配足够大,先假设data是由640*480像素的压缩数据解码得来的,RGB3字节)是一个像素,故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 charunsigned int4个字节的,unsigned char 1个字节的,所以我们这里做的事情是将每一个RGB单元放到p_bits的每个unsigned int4字节)中。因为p_bitsunsigned 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();

 

posted on 2010-08-18 18:00 Dragon 阅读(6110) 评论(1)  编辑 收藏 引用 所属分类: QT
评论:
  • # re: QT中显示图像数据  Dragon Posted @ 2010-12-19 11:47
    QPixmap pixmap=QPixmap::fromImage(img);
    pixmap=pixmap.scaled(widget->size());

    可以不要,
    img=img.scaled(widget->size());
    palette.setBrush(widget->backgroundRole(), QBrush(img));就行。  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Dragon Powered by: 博客园 模板提供:沪江博客