目录

  • 一、项目介绍
  • 二、项目基本配置
  • 三、UI界面设计
  • 四、主程序实现
  • 4.1 widget.h头文件
  • 4.2 widget.cpp源文件
  • 五、效果演示


一、项目介绍

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

二、项目基本配置

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

三、UI界面设计

UI界面布局如下:

qt中对相机图像镜像_c++


界面中创建了3个控件,其名称和类型如下:

序号

名称

类型

属性


Choose

QPushButton

text:选择图片


Gray

QPushButton

text:灰度化


imagelabel

QLabel

\

四、主程序实现

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中栈是向低地址扩展的数据结构(与此对应,堆是向高地址扩展的数据结构)。在小端存储模式下,低地址存放低有效字节,栈中数据的结构如下图所示:

qt中对相机图像镜像_c++_02

五、效果演示

qt中对相机图像镜像_c++_03