目录

一、概述

1、Qt可显示的图像类型

2. Qt用如何显示图像

二、图像旋转

1、transformed函数实现图片旋转

2、使用QPainter

三、图像缩放

1、scaled函数实现图像缩放

2、QPainter实现

3、图像连续缩放      


一、概述

        Qt可显示基本的图像类型,利用QImage、QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放、旋转)。

1、Qt可显示的图像类型

参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。

2. Qt用如何显示图像

        通常用QLabel显示图像,QLabel类有setPixmap()函数,可以用来显示图像。也可以直接用QPainter画出图像。

        如果图像过大,直接用QLabel显示,将会出现有部分图像显示不出来,这时可以用Scroll Area部件。方法:将QLabel部件放到Scroll Area部件里面,将两个采用栅格布局,当图像超出了QLabel部件大小时,就会产生滑动杆,这样图像就可以都看到了。

二、图像旋转

1、transformed函数实现图片旋转

        使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下:

QMatrix matrix;
matrix.rotate(45);


QPixmap pix = QPixmap(“:/images.png”).transformed(matrix, Qt::SmoothTransformation);
QLabel *plabel= new QLabel(this);
pLable->setPixmap(pix);

该段程序实现的效果是使图片顺时针旋转 45 度。

2、使用QPainter

使用 QPainter 这位“画家”,示例程序如下:

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.save();
    QPixmap disc(":/disc.png");

    /* 碟机转动 */
    if(imageRotate++ == 360)
        imageRotate = 0;
    /* 设定旋转中心点 */
    painter.translate(130,150);
    /* 旋转的角度 */
    painter.rotate(imageRotate);
    /* 恢复中心点 */
    painter.translate(-130,-150);
    /* 画图操作 */
    int x=40,y=60;
    painter.drawPixmap(x,y,180,180, disc);//x,y为屏幕上画的位置
    painte.restore();
}

三、图像缩放

1、scaled函数实现图像缩放

        图像缩放采用scaled函数。函数原型

QImage QImage::scaled ( const QSize & size,Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationModetransformMode = Qt::FastTransformation ) const

        使用方法如下,还是利用上面的img:

QImage* imgScaled = new QImage;
*imgScaled=img->scaled(width,height,Qt::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));

        scaled函数中width和height表示缩放后图像的宽和高,即将原图像缩放到(width,height)大小。

2、QPainter实现

使用 QPainter 这位“画家”,示例程序如下:

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.save();
    QPixmap disc(":/disc.png");

    /* 碟机转动 */
    if(imageRotate++ == 360)
        imageRotate = 0;
    /* 设定旋转中心点 */
    painter.translate(130,150);
    /* 旋转的角度 */
    painter.rotate(imageRotate);
    painter.scale(2,2);
    /* 恢复中心点 */
    painter.translate(-130,-150);
    /* 画图操作 */
    int x=40,y=60;
    painter.drawPixmap(x,y,180,180, disc);//x,y为屏幕上画的位置
    painte.restore();
}

3、图像连续缩放      

        有了图像缩放的基础,就可以实现图像的连续缩放,可以放置一个横向滑竿(中文解释不标准,就是Horizontal Slider部件 ),滑动滑轮的位置以实现图像连续缩放。Horizontal Slider部件指向的值为整型value,即缩放后的图像为

img->scaled(orignalWidth*value/100,orignalHeight*value/100, Qt::KeepAspectRatio);

        orignalWidth和orignalHeight为原始图像的宽和高。

        注意:在对原始图像进行缩放多少倍数时,在相应的槽函数内只需要调用Horizontal Slider部件对象的setValue函数即可,因为Horizontal Slider部件滑竿指向的值一旦变化就会触发对应的槽函数来对图像进行缩放。