1.概述
Qt提供了QImage、QPixmap、QBitmap和QPicture四种处理图像数据的类。本文本只着重讲解QImage类的使用。QImage提供了一个与硬件无关的图像表示方法,允许直接访问像素数据,可用作绘图设备。提供了很多可以用于获取图像信息和进行图像变换的函数。主要功能如下:
(1)图像加载。对png、jpg、ico格式图像的加载;
(2)图像变换。图像放大、缩小、旋转、镜像等操作;
(3)像素颜色修改。图像黑白化(本文只介绍这一种,其他色彩变化同理);
(4)图像另存。另存为png、jpg、ico格式图像。
功能展示:
新建ImageDlg类,头文件内容如下。
#include <QWidget>
#include <QImage>
#include <QFileDialog>
namespace Ui {
class ImageDlg;
}
class ImageDlg : public QWidget
{
Q_OBJECT
public:
explicit ImageDlg(QWidget *parent = 0);
~ImageDlg();
private slots:
//放大
void onZoomIn();
//缩小
void onZoomOut();
//顺时针旋转
void onRotateS();
//逆时针旋转
void onRotateN();
//横向镜像
void onVerMirror();
//纵向镜像
void onHorMirror();
//灰度
void onGray();
//灰度1
void onGray1(int grayR=127,int grayG = 127,int grayB = 127);
//另存为
void onSave();
private:
Ui::ImageDlg *ui;
QImage m_img;
};
2.图像加载
ui->label->setScaledContents(true);
if(m_img.load("../SRC/banna/1.jpg"))
{
ui->label->setPixmap(QPixmap::fromImage(m_img));
}
3.图像变换
3.1放大
if(m_img.isNull())
return;
//声明一个QMatrix类的实例,并按照2倍比例对水平和垂直方向进行放大,当前图形按照该坐标矩阵进行转换
QMatrix martix;
martix.scale(2,2);
m_img = m_img.transformed(martix);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
3.2缩小
if(m_img.isNull())
return;
//声明一个QMatrix类的实例,并按照2倍比例对水平和垂直方向进行缩小,当前图形按照该坐标矩阵进行转换
QMatrix martix;
martix.scale(0.5,0.5);
m_img = m_img.transformed(martix);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
3.3顺时针旋转
if(m_img.isNull())
return;
//声明一个QMatrix类的实例,并按照2倍比例对水平和垂直方向进行缩小,当前图形按照该坐标矩阵进行转换
QMatrix martix;
martix.rotate(90);
m_img = m_img.transformed(martix);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
3.4逆时针旋转
if(m_img.isNull())
return;
//声明一个QMatrix类的实例,并按照2倍比例对水平和垂直方向进行缩小,当前图形按照该坐标矩阵进行转换
QMatrix martix;
martix.rotate(-90);
m_img = m_img.transformed(martix);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
3.5横向镜像
//QImage::mirrored(bool horizontal,bool vertical);
if(m_img.isNull())
return;
m_img = m_img.mirrored(true,false);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
3.6纵向镜像
//QImage::mirrored(bool horizontal,bool vertical);
if(m_img.isNull())
return;
m_img = m_img.mirrored(false,true);
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(m_img));
4.像素颜色变化
4.1灰度
int w = m_img.width();
int h = m_img.height();
QImage iGray(w,h,QImage::Format_ARGB32);
for(int i = 0; i < w;i++)
{
for(int j = 0;j < h;j++)
{
QRgb pixel = m_img.pixel(i,j);
//int gray = qGray(pixel);
int gray = qBlue(pixel);
QColor color(gray,gray,gray,qAlpha(pixel));
iGray.setPixel(i,j,color.rgb());
}
}
//重新设置显示图形
ui->label->setPixmap(QPixmap::fromImage(iGray));
5.图像另存
QString file = QFileDialog::getSaveFileName(this,"save image","./","PNG files(*.png);;JPG files(*.jpg);;ICON files(*.ico)");
if(file != "")
{
m_img.save(file);
}