繪圖(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

  • JOHN

    您好 很感謝可以分享這麼棒的教學文,想請問如果想在圖上某一個區域做一個透明的按鍵(Button),點下去後另一張圖覆蓋掉原本的圖(不要蓋掉整張圖),那該怎麼做? 譬如點蘋果的葉子後,原本朝右邊的綠葉變成朝左邊的黃葉?在同一張圖的蘋果右半邊上點第二個按鍵後蘋果就缺一口(用缺一口的圖覆蓋上),那該怎麼做? 有任何的建議都非常感謝!!