• (转)Qt的4个图像类QImage/QPixmap/QBitmap/QPicture


    QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果你想访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素。另外跟QImage不同是,QPixmap跟硬件是相关的,如X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。

    相信大家更关心的是谁比较快,哈哈,现在来总结一下:
    在X11, Mac 以及 Symbian平台上,QImage: 因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap: 因为它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快。但在Windows平台上则是是一样的,因为它们都存储在客户端。

    Qt上图片处理使用QPixmap和QImage时最多了,不过既然谈到图片了,我们把其他几个图片处理类也说一下:
    QBitmap只是一个继承于QPixmap的简单类,它可以确保图片深度为1。
    QBitmap是QPixmap的子类,提供单色图像,可以用来制作游标(QCursor)或者笔刷(QBrush)。我们可以通过以下代码看出两者的区别:

    1. class PainterWidget : public QWidget {
    2. protected:
    3.     void paintEvent(QPaintEvent*);
    4. };
    5. void PainterWidget::paintEvent(QPaintEvent *event) {
    6.     QPixmap pixImg("caterpillar.jpg");
    7.     QBitmap bitImg("caterpillar.jpg");
    8.     QPainter painter(this);
    9.     painter.drawPixmap(0, 0, pixImg);
    10.     painter.drawPixmap(200, 0, bitImg);
    11. }
    12. int main(int argc, char *argv[]) {
    13.     QApplication app(argc, argv);
    14.    
    15.     PainterWidget pWidget;
    16.     pWidget.setWindowTitle("QPixmap & QBitmap");
    17.     pWidget.resize(400, 150);
    18.     pWidget.show();
    19.    
    20.     return app.exec();
    21. }

    执行效果如下图所示:


    QPicture是一个绘画设备类,它记录了并可以重演QPainter的命令。你可以使用QPainter的begin()方法,指定在QPicture上绘图,使用
    end()方法结束绘图,使用QPicture的save()方法將QPainter所使用过的绘图指令存至档案,例如:

    1. QPicture
    2. picture;
    3. QPainter painter;
    4. painter.begin(&picture);
    5. painter.drawRect(10, 20, 100,
    6. 50);
    7. painter.end();
    8. picture.save("draw_record.pic");

    要重播绘图指令的话,建立一個QPicture,使用load()方法载入绘图指令的档案,然后在指定的绘图裝置上绘制QPicture:

    1. QPicture
    2. picture;
    3. picture.load("draw_record.pic");  
    4. QPainter
    5. painter;
    6. painter.begin(this);
    7. painter.drawPicture(0, 0, picture);
    8. painter.end();

  • 相关阅读:
    sql注入漏洞详解
    HTTP1.0/1.1/2.0的区别
    http协议详解
    LRU经典算法的原理与实现
    [译转]深入理解LayoutInflater.inflate()
    Touch事件分发机制
    重要:Android绘图只Mask遮罩
    Android View学习Tips
    ViewPager学习及使用(一)
    Android 实现瀑布流的两种思路
  • 原文地址:https://www.cnblogs.com/yysblog/p/2219930.html
Copyright © 2020-2023  润新知