• QImage对一般图像的处理


    Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。

    本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像。首先要获得源图像数据,对源图像数据进行处理,将结果保存并显示。

    QImage *img;//原图像
    QImage *grayImg;//处理后灰度图像

    1.获得原图像数据

    采用此方法即可,

    unsigned char *data=img->bits();//获取图像像素字节数据的首地址
    

    这里要注意,采用bits()方法的到的数据data中像素的组织形式应为ARGB,但实际调试中发现,每个像素中从字节从低到高依次是BGRA,方向刚好反过来。在处理彩色图像时尤其注意。下面会解释这样排列顺序的原因。

    2.灰度处理

     1 int width=img->width();//图像宽
     2 int height=img->height();//图像高
     3 
     4 int bytePerLine=(width*24+31)/8;//图像每行字节对齐
     5 
     6 graydata=new unsigned char[bytePerLine*height];//存储处理后的数据
     7 
     8 unsigned char r,g,b;
     9 for (int i=0;i<height;i++)
    10 {
    11     for (int j=0;j<width;j++)
    12     {
    13         r = *(data+2);
    14         g = *(data+1);
    15         b = *data;
    16 
    17         graydata[i*bytePerLine+j*3]  =(r*30+g*59+b*11)/100;
    18         graydata[i*bytePerLine+j*3+1]=(r*30+g*59+b*11)/100;
    19         graydata[i*bytePerLine+j*3+2]=(r*30+g*59+b*11)/100;
    20 
    21         data+=4;
    22     }
    23 }

    上述代码中要注意字节对齐,否则可能处理完后的图像会变形扭曲。此外要注意r/g/b三值的获得,下面解释其具体原因。

    首先,data指针是存放在栈中的,在windows中栈是向低地址扩展的数据结构(与此对应,堆是向高地址扩展的数据结构)。在小端存储模式下,低地址存放低有效字节,栈中数据的结构如下图所示:

    3.显示图像

    1 grayImg=new QImage(graydata,width,height,bytePerLine,QImage::Format_RGB888);
    2 ui.label->setPixmap(QPixmap::fromImage(*grayImg));
  • 相关阅读:
    百度浏览器 h5页面fixed布局不显示问题
    Vue3_arco.design icon 组件批量渲染
    异步加载数据的 js tree (基于Jquery)
    ASP.NET MVC 与 WebForm 对比
    asp.net 页面生命周期
    ASP.NET通过OLE DB操作Excel
    SQL 分页查询的几种方式
    OLEDB读取Excel文件丢失部分数据
    MVC 基于FormsAuthentication 方式的权限验证
    Session不超时
  • 原文地址:https://www.cnblogs.com/Romi/p/2800039.html
Copyright © 2020-2023  润新知