Qt实战案例(34)——利用QImage类实现对图像的简单处理(显示图像、灰度化处理)

一、项目介绍

利用QImage类实现对图像的简单处理,包括显示图像、灰度化处理等。

二、项目基本配置

新建一个Qt案例,项目名称为“ImageTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建。

三、UI界面设计

UI界面布局如下:
在这里插入图片描述
界面中创建了3个控件,其名称和类型如下:

序号名称类型属性
ChooseQPushButtontext:选择图片
GrayQPushButtontext:灰度化
imagelabelQLabel\

四、主程序实现

4.1 widget.h头文件

声明三个变量和两个槽函数:

public:
    QImage img;//原始图片
    unsigned char *graydata;
    QImage *grayImg;//灰度图片

private slots:
    void on_Choose_clicked();
    void on_Gray_clicked();

4.2 widget.cpp源文件

定义打开图片槽函数:

//打开图片
void Widget::on_Choose_clicked()
{
    QString path=QFileDialog::getOpenFileName(this,"打开文件","E:\\image\\","(*.jpg)");
    img.load(path);
    ui->imagelabel->setPixmap(QPixmap::fromImage(img));
}

定义灰度化槽函数:
首先需要获取图像像素字节数据的首地址:

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

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

灰度处理并显示图像:

   int width=img.width();//获取图像宽度
    int height=img.height();//获取图像高度
    int bytePerLine=(width*24+31)/8;//图像每行字节对齐

    graydata=new unsigned char[bytePerLine*height];//存储处理后的数据

    unsigned char r,g,b;//定义rgb
    for (int i=0;i<height;i++)
    {
        for (int j=0;j<width;j++)
        {
            r = *(data+2);
            g = *(data+1);
            b = *data;
            //RGB转灰度的计算公式Gray=(R*30+G*59+B*11)/100
            graydata[i*bytePerLine+j*3]  =(r*30+g*59+b*11)/100;
            graydata[i*bytePerLine+j*3+1]=(r*30+g*59+b*11)/100;
            graydata[i*bytePerLine+j*3+2]=(r*30+g*59+b*11)/100;

            data+=4;
        }
    }
    //显示图像
    grayImg=new QImage(graydata,width,height,bytePerLine,QImage::Format_RGB888);
    ui->imagelabel->setPixmap(QPixmap::fromImage(*grayImg));

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

五、效果演示

在这里插入图片描述

如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/79578652


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值