繪圖(QPixmap、QBitmap、QImage)

在處理影像資料上,Qt提供了QPixmap、QBitmap、QImage、QPicture等類別。

  • QPixmap繼承了QPaintDevice,可用QPainter於上進行繪圖,也可以載入BMP、GIF、JPG、JPEG、PNG等圖檔,並使用QPainter的drawPixmap()繪製在其它的繪圖裝置上。QPixmap與實際的底層顯示設備息息相關,所以在不同的平台上可能會有不一致的結果。
  • QBitmap是QPixmap的子類別,只有黑白兩色的圖像數據,提供單色圖像,佔用很少的存儲空間,適合於製作游標和筆刷物件。
  • QPixmap使用底層平台的繪製系統進行繪製,無法提供像素級別的操作,而QImage則是獨立於硬體的繪製系統,因此可以用setPixel()函式,對影像的像素進行設置,且QImage在不同系統上有相同的影像。

這邊分別示範QPixmap、QBitmap、QImage的使用。


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QBitmap>
#include <QImage>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *);
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setWindowTitle(tr("繪圖"));
}

void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    QPixmap pixmap("icon.jpg");
    QBitmap bitmap("icon.jpg");
    painter.drawPixmap(10, 50, 100, 100, pixmap);   //將pixmap自行縮放,繪製於(x,y,width,height)範圍內
    painter.drawPixmap(140, 50, 100, 100, bitmap);

    QRectF rect(270,50,100,100);
    QImage image("icon.jpg");
    QRgb value = qRgb(0, 0, 0);
    image.setPixel(100, 100, value);  //對點(100,100)的顏色作變更
    painter.drawImage(rect, image);   //將image繪製於rect範圍內
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(400,200);
    w.show();

    return a.exec();
}

QPixmap