精华内容
下载资源
问答
  • 32黑马QT笔记之QPixmap和QImage的相互转换 1 QPixmap与QImage的互相转换: 1)头文件: void paintEvent(QPaintEvent *); 2)实现.cpp文件: void Widget::paintEvent(QPaintEvent *) { QPainter p(this); //...

    32黑马QT笔记之QPixmap和QImage的相互转换

    1 QPixmap与QImage的互相转换:
    1)头文件:

    void paintEvent(QPaintEvent *);
    

    2)实现.cpp文件:

    void Widget::paintEvent(QPaintEvent *)
    {
        QPainter p(this);
        
        //QPixmap -> QImage    
        QPixmap pixmap;
        pixmap.load("../Image/face.png");
        QImage tempImage = pixmap.toImage();
        p.drawImage(0, 0, tempImage);
    
        //QImage -> QPixmap
        QImage image;
        image.load("../Image/face.png");    
        QPixmap tempPixmap = QPixmap::fromImage(image);
        p.drawPixmap(100, 0, tempPixmap);
    
    }
    
    展开全文
  • (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthread.php?tid=267 QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果...

    (一)QPixmap和QImage的区别

    http://www.thisisqt.com/forum/viewthread.php?tid=267

    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)。

    QPicture是一个绘画设备类,它记录了并可以重演QPainter的命令。你可以使用QPainter的begin()方法,指定在QPicture上绘图,使用end()方法结束绘图,使用QPicture的save()方法將QPainter所使用过的绘图指令存至档案。要重播绘图指令的话,建立一個QPicture,使用load()方法载入绘图指令的档案,然后在指定的绘图裝置上绘制QPicture:

    (二)QImage与QPixmap完全解析

    http://www.civilnet.cn/bbs/browse.php?topicno=4691

    用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了。那么先让大家看两段代码:

    //dangerous should not be used, cannot display earth.png,  
    //but if we change earth.png to a smaller image e.g. apple.png, apple.png can be displayed
    QPixmap pixmap;
    pixmap.load( ":/pics/earth.png" );
    label->setPixmap( pixmap );


    //dangerous should not be used, cannot display earth.png,  
    //but if we change earth.png to a smaller image e.g. apple.png, apple.png can be displayed
    QPixmap pixmap;
    pixmap.load( ":/pics/earth.png" );
    QPainter painter(this);
    painter.drawPixmap(0,0, pixmap);
    大家认为这两段代码有什么问题吗? 看起来好像没什么问题啊。是的,在Windows操作系统上是没有问题的。问题是我们做的是Qt for Symbian! 手机上的资源本来就是比较紧缺的,所以我们使用的时候就需要更加注意。 Qt 为我们提供了四个处理图像的类:QImage,QPixmap,QBitmap 和QPicture。其中前两个是最常使用的。

    本文就通过一个例子,一步一步为大家讲解QImage与QPixmap的使用奥秘,在此过程中为大家揭示以上代码存在的缺陷。
    QPixmap依赖于硬件

    首先需要知道的是QPixmap的具体实现是依赖于系统的。在Symbian系统上QPixmap是被存放在Server端的。 
    目前的Qt会把QPixmap都存储在graphics memory中,这明显是依赖硬件的。因此我们对QPixmap的使用需要格外注意。这也正是以上两段代码存在问题的根源。
    那么Qt为什么要这么做呢?很简单,设计之初QPixmap就是用来加速显示的,例如我们在paint的时候用QPixmap就会比用其他类的效果好许多。

    现在回到我们最初的问题,以上代码到底有什么问题呢?我们可以先用本文提供的例子程序做个试验。当使用上述代码显示较小图片的时候(比如例子程序中的background.png 和apple.png)是没有问题的,图片都能在手机上正确显示。
    但是当我们把图片换成一副较大图片287KB,1058 x 1058的“earth.png”的时候就出现问题了,图片无法显示,程序的界面是一片空白。

    据测算,“earth.png”被完全解码后存储在graphics memory中会占用大约4.3MB的空间。如果此时还有其他加载的窗口和QPixmap,很可能就没有空间了。
    使用QImage加载后转换成QPixmap 显示

    那么安全和正确的方法应该是什么呢?答案是我们需要用QImage做一下预处理:

    //correct and recommended way
    QImage image;
    image.load( ":/pics/earth.png" );

    QPainter painter(this);
    QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::KeepAspectRatio) );
    painter.drawPixmap(0,0, pixmapToShow);
    和QPixmap 不同,QImage是独立于硬件的,它可以同时被另一个线程访问。QImage是存储在客户端的,对QImage的使用是非常方便和安全的。 又由于 QImage 也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI 线程中处理,使用这一方式可以很大幅度提高UI响应速度。 因此当图片较大时,我们可以先通过QImage将图片加载进来,然后把图片缩放成需要的尺寸,最后转换成QPixmap 进行显示。

    其中需要注意的是Qt::KeepAspectRatio的使用,默认参数是Qt::IgnoreAspectRatio,如果我们在程序中这么写:QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::IgnoreAspectRatio) );

    我们也可以直接使用QImage做显示,而不转换成QPixmap ,这要根据我们应用的具体需求来决定,如果需要的话我们可以这么写:

    //correct, some times may be needed
    QImage image;
    image.load( ":/pics/earth.png" );

    QPainter painter(this);
    painter.drawImage(0,0, image);
    展开全文
  • QPixmap QImage区别

    千次阅读 2013-07-11 08:46:22
    QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。...另外跟QImage不同是,QPixmap跟硬件是相关的,如X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客

    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)。我们可以通过以下代码看出两者的区别:
    class PainterWidget : public QWidget {
    
    protected:
    
        void paintEvent(QPaintEvent*);
    
    };
    
    void PainterWidget::paintEvent(QPaintEvent *event) {
    
        QPixmap pixImg("caterpillar.jpg");
    
        QBitmap bitImg("caterpillar.jpg");
    
        QPainter painter(this);
    
        painter.drawPixmap(0, 0, pixImg);
    
        painter.drawPixmap(200, 0, bitImg);
    
    }
    
    int main(int argc, char *argv[]) {
    
        QApplication app(argc, argv);
    
       
    
        PainterWidget pWidget;
    
        pWidget.setWindowTitle("QPixmap & QBitmap");
    
        pWidget.resize(400, 150);
    
        pWidget.show();
    
       
    
        return app.exec();
    
    }
    

     


    执行效果如下图所示:

     

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

    QPicture
    
    picture;
    
    QPainter painter;
    
    painter.begin(&picture);
    
    painter.drawRect(10, 20, 100,
    
    50);
    
    painter.end();
    
    picture.save("draw_record.pic");
    


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

    QPicture
    
    picture;
    
    picture.load("draw_record.pic");  
    
    QPainter
    
    painter;
    
    painter.begin(this);
    
    painter.drawPicture(0, 0, picture);
    
    painter.end(); 
    


     

     

     

    展开全文
  • QPixmap和QImage的区别

    2014-04-29 08:41:04
    QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmapQImage则是为I/O,为图片像素访问以及修改而设计的。如果你想访问图片的像素或是修改图片像素,则需要使用...另外跟QImage不同是,QPixmap跟硬件

    http://www.thisisqt.com/forum/viewthread.php?tid=267


    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();
    复制代码

    展开全文
  • qt中QPixmap和QImage使用

    2021-04-10 22:25:14
    QPixmap 针对绘图进行了优化,一般用于显示加载,平台相关。而QImage则主要是为图像I/O传输、图片访问像素修改等操作,平台无关,可以用来优化UI响应时间。 QString openfilename=QFileDialog::...
  • (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthread.php?tid=267 QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果...
  • Qt的绘图系统允许使用相同的API在屏幕其他打印设备上进行绘制。整个绘图系统基于 QPainter,QPainterDevice QPaintEngine三个类。 QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维...
  • QPixmap转为Image: void Widget::paintEvent(QPaintEvent *) { QPainter p(this); QPixmap pixmap; pixmap.load("../Image/noya.jpg"... QImage tempImage = pixmap.toImage(); p.drawImage(0, 0...
  • #include <QPixmap> 一、QPixmap void Dialog::on_Button1_clicked() { QPixmap img; img.load("1.bmp"); ui->labelPic->clear(); ui->labelPic->setPixmap(img);...
  • QPixmap p1,p2; p1.load("1.png"); painter.drawPixmap(0,0,p1); p2.load("2.png"); painter.drawPixmap(0,0,p2); 这样确实可以实现两张图片的叠合显示 然后现在我想把叠合后的图片保存为一个文件,应该怎么...
  • 但是,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。 (3)绘图速度 在X11, Mac 以及 Symbian平台上 QImage: 由于它存储在客户端,往QImage上绘图比较快,但显示它则比较慢。 ...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 338
精华内容 135
关键字:

qpixmap和qimage