QT绘图类 QPixmap、QImage、QPicture、QBitmap

前言

绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap、QBitmap、QImage和 QPicture。其中:

  • QPixmap是为在屏幕上显示图像而设计和优化;
  • QBitmap是 QPixmap 的一个子类,它的色深限定为 1,你可以使用 QPixmap 的 isQBitmap() 函数来确定这个QPixmap 是不是一个 QBitmap;
  • QImage是为 I/O 和直接像素访问和操作而设计和优化;
  • QPicture是一个绘图装置,用于记录和重播Qpainter的绘图指令;

1.QPixmap和QBitmap

QPixmap继承了QPaintDevice,因此,可以使用QPainter直接在上面绘制图形。QPixmap也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开png、jpeg之类的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函数可以把这个文件绘制到一个QLabel、QPushButton或者其他的设备上面。

QPixmap是针对屏幕上显示图像而进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。所以,在不同的操作系统平台下,QPixmap的显示可能会有所差别。

QBitmap继承自QPixmap,因此具有QPixmap的所有特性,但只提供单色图像,也就是说QBitmap实际上是只有黑白两色的图像数据。由于QBitmap色深小,因此只占用很少的存储空间,所以适合做光标文件和笔刷。

程序演示:

void Widget::paintEvent(QPaintEvent *)
{
        QPainter p(this);//定义画家

        //QPixmap 图片背景透明
        //p.drawPixmap(0,0,200,200,QPixmap("../image/10.jpg"));
        //QBitmap 图片背景透明
        //p.drawPixmap(200,0,200,200,QBitmap("../image/10.jpg"));

        //QPixmap 图片背景白色
        QPixmap pixmap;
        pixmap.load("../image/pig.jpg");
        p.drawPixmap(0,200,200,200,pixmap);

        //QPixmap 图片背景白色
        QBitmap bitmap;
        bitmap.load("../image/pig.jpg");
        p.drawPixmap(200,200,200,200,bitmap);
}

结果:

                        

参考:Qt5基础 QPixmap和QBitmap的区别_qbit qt-CSDN博客

2. QImage

由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度;

QImage 类用于加载图像文件,可选地操作图像数据,然后将 QImage 对象转换为 QPixmap 以显示在屏幕上。或者,如果不需要任何操作,可以将图像文件直接加载到 QPixmap 中,

QImage 则是使用独立于硬件的绘制系统,实际上是自己绘制自己,因此提供了像素级别的操作,并且能够在不同系统之上提供一个一致的显示形式。

代码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QImage image(300, 200, QImage::Format_RGB888);
    image.fill(Qt::white);
    QPainter painter(&image);
    painter.setPen(QPen(Qt::black, 5));
    painter.drawRect(QRect(30, 30, 240, 140));
    painter.setFont(QFont("Arial", 16, QFont::Bold));
    painter.drawText(QPoint(65, 85), "Hello QImage!");

    ui->label->setPixmap(QPixmap::fromImage(image));

}

结果:

 如需深入了解QImage类可以参考:QImage类的使用-CSDN博客

Qt实战案例(36)——利用QImage类实现对图像的基本操作(图像显示、图像缩放、图像旋转)_qimage 旋转-CSDN博客

3.QPicture

记录和回放QPainter的绘图指令

  • begin() 开始在QPicture上绘图 
  • end() 结束在QPicture上绘图 
  • save() 保存操作为.pic文件 
  • load() 加载.pic文件

构造函数种保存图片

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPicture picture;
    QPainter painter;
    painter.begin(&picture);
    painter.drawEllipse(10,20,80,70);
    painter.end();
    picture.save("my.pic");

}

paintEvent函数种加载图片

void MainWindow::paintEvent(QPaintEvent* e)
{
    QPicture picture;
    picture.load("my.pic");

    QPainter painter;
    painter.begin(this);
    painter.drawPicture(0,0,picture);
    painter.end();
}

结果:

参考:Qt 处理图像数据的类区别(QPixmap、QImage、QPicture)-CSDN博客

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值