代码改变世界

QImage,QPixmap,QBitmap,QPicture

2010-12-07 09:28  bingcaihuang  阅读(2150)  评论(0编辑  收藏  举报

QImage是设计并优化来为 I/O操作的,可以直接访问和操作像素,而QPixmap是设计并优化来在屏幕上显示图片的。QBitmap仅是继承自QPixmap的一个方便使用的类,是为了确保图片的深度为1.QPicture是绘图设备,可以用来重现QPainte

QImage是设计并优化来为 I/O操作的,可以直接访问和操作像素,而QPixmap是设计并优化来在屏幕上显示图片的。QBitmap仅是继承自QPixmap的一个方便使用的类,是为了确保图片的深度为1.QPicture是绘图设备,可以用来重现QPainter命令。

QPixmap继承了QPaintDevice,您可用以建立QPainter並於上進行绘图,您也可以直接指定图案载入Qt所支援的图档,像是BMP、GIF、JPG、JPEG、PNG等,并使用QPainter的drawPixmap()绘制在其它的绘图装置上。您可以在QLabel、QPushButton上设定QPixmap以显示图像。QPixmap是针对荧幕显示图像而设计并最佳化,依赖于所在平台的原生绘图引擎,所以一些效果的展现(像是反锯齿),在不同的平台上可能会有不一致的结果。

QBitmap是QPixmap的子类別,提供单色图像,可用于制作游标(QCursor)或画刷(QBrush)物件。下面的程序载入相同的图档,以观看QPixmap与QBitmap的呈现效果:

#include<QApplication>

#include <QWidget>

#include <QPainter>

#include <QBitmap>

 

class PainterWidget :public QWidget {

protected:

    void paintEvent(QPaintEvent*);

};

 

voidPainterWidget::paintEvent(QPaintEvent *event) {

    QPixmappixImg("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();

}

 

執行後的結果如下圖所示:

QPixmap使用平台的绘图引擎,在不同的平台所呈现的效果不一,无法提供個別像素的存取,QImage使用Qt自身的绘图引擎,可提供在不同平台上相同的图像呈现效果,並可透过setPixpel()、pixel()等方法,直接存取指定的像素,例如在Qt的QImage文件中,就有提供以下的范例:

 

QImage image(3, 3,QImage::Format_RGB32);

QRgb value;

 

 value = qRgb(189, 149, 39); // 0xffbd9527

 image.setPixel(1, 1, value);

 

 value = qRgb(122, 163, 39); // 0xff7aa327

 image.setPixel(0, 1, value);

 image.setPixel(1, 0, value);

 

 value = qRgb(237, 187, 51); // 0xffedba31

 image.setPixel(2, 1, value);

 

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 picture;

picture.load("draw_record.pic"); 

QPainter painter;

painter.begin(this);

painter.drawPicture(0, 0,picture);

painter.end();