2011年12月27日火曜日

( Qt C++ )QPainterを使用しQImageの画像を合成する。


 ※最近変な海外アドレスからのトラフィック(あきらかに広告誘導)がバンバンくるようになり気味が悪いので忍者バリアを設置しました。申し訳ないのですがjavascriptはonにしてブログを閲覧してください。

はいそれでは表題の ”QPainterを使用しQImageの画像を合成する。” をやっていきます。
サンプルは独自のものを使います。
そして、いつものようにQtCreaterなどでMainWindowなどのGUI部品を定義済みであるとします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを

(mainwindow.h)
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT//マクロ
   
public:
    explicit MainWindow(QWidget *parent = 0);//コンストラクタ
    ~MainWindow();//デストラクタ

protected:
    void paintEvent(QPaintEvent *);//←ここ重要!ペイントイベント
  
private:
    Ui::MainWindow *ui;//uiにはGUI部品が記述
}; 

(mainwindow.cpp)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiにはGUI部品に関する記述
{
    ui->setupUi(this);//uiのGUI部品の初期化
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)//←重要!ペイントイベント
{
    QImage image(this->size(), QImage::Format_ARGB32_Premultiplied);//空イメージ

    QPainter imagePainter(&image);//空イメージを引数に
    imagePainter.setRenderHint(QPainter::Antialiasing, true);
    imagePainter.drawImage(50,50,QImage("//home//ubuntu001//sampleImage.png"));/*元となる画像をまず描画*/

    imagePainter.setCompositionMode(QPainter::CompositionMode_Xor);//合成モードセット

    imagePainter.drawImage(50,50,QImage("//home//ubuntu001//sampleImage2.png"));/*合成するためにさらに描画*/

    QPainter widgetPainter(this);//ウィジット用のQPainter
    widgetPainter.drawImage(0, 0, image);//ウィジットに合成済みイメージ描画
}


少しややこしいですね。理解に重要なのはpaintEventだけですので他は無視してしまっても構いません。
まず空のthis->size(この場合MainWindowのサイズ)の32ビットARGBフォーマットのQImageを作成します。
その後、このQImage imageに描くためのQPainter imagePainterを作成した空のimageを引数にして定義します。そしてimagePainterにアンチエイリアスをセットし、(50、50)の位置に設定した画像をまずimageへ描画しています。
その後 setCompositionModeで合成モードを設定しています。今回はXORで合成しています。このあたりはリファレンスに見本が載っていますのでそちらを見てください。
(リファレンスへ
(Modeの種類 リファレンスへ
それから合成するためにさらにdrawImageを呼び出しイメージに描画し、最後にウィジットに合成したQImageを描画しています。

実行すると以下のようになります。(左が合成画像、右が通常に描いた場合の画像です。)
以上です。次回は画像のサムネイル取得関係を予定しています。