2018年4月7日土曜日

QPixmapColorizeFilter

Graphics Effects の内部クラス QPixmapColorizeFilter を使って画像に色を付けられます。ただし Graphics Effects は設計上の欠陥のために廃止されています。
harness.h:

#pragma once

#include <QWidget>
#include <private/qpixmapfilter_p.h>

class Harness : public QWidget
{
    Q_OBJECT

public:
    explicit Harness(const QString& fileName, const QColor& colorizingColor = QColor(7+50, 142, 17+50));

protected:
    void paintEvent(QPaintEvent* event) override;

private:
    struct {
        QString fileName;
        QPixmapColorizeFilter* colorizingFilter;
        QPixmap pixmap;
        QColor colorizingColor;
    } d;
};

harness.cpp:

#include "harness.h"
#include <QPainter>
#include <QDebug>

Harness::Harness(const QString& fileName, const QColor& colorizingColor)
    : QWidget(0)
{
    d.fileName = fileName;
    d.colorizingColor = colorizingColor;
    d.colorizingFilter = new QPixmapColorizeFilter(this);
    if (!d.pixmap.load(fileName)) {
        qDebug() << "Invalid image file " << fileName << endl;
        return;
    }
    resize(d.pixmap.size());
}

void Harness::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    d.colorizingFilter->setColor(d.colorizingColor);
    d.colorizingFilter->draw(&painter, QPointF(0.0, 0.0), d.pixmap);
}
QPixmapColorizeFilter::draw() の呼び出し方は以下のようになっています。
void draw(QPainter* painter, const QPointF& dest, const QPixmap& src, const QRectF& srcRect = QRectF()) const;
painter描画先 QPainter。
dest色を付けた画像の描画位置。
src元画像。
srcRect元画像の部分矩形領域。空ならば全領域。指定した画像領域を切り出し色付して描画する。
main.cpp:

#include "harness.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    switch (app.arguments().count()) {
    case 2:
    case 3:
        break;
    default:
        qWarning() << "Usage: colorise image [color]";
        exit(-1);
    }

    const QString fileName = app.arguments().at(1);

    QScopedPointer harness([&]() {
        if (app.arguments().count() == 2) {
            return new Harness(fileName);
        } else {
            const QColor colorizingColor(app.arguments().at(2));
            return new Harness(fileName, colorizingColor);
        }
    }());

    harness.data()->show();

    return app.exec();
}
コマンドラインで画像ファイルと色を指定して動かします。色を指定しない場合にはデフォルトの緑色になります。
colorize.pro:

QT += widgets widgets-private

SOURCES += main.cpp \
    harness.cpp

HEADERS += \
    harness.h
プライベートクラスを使っているので widgets-private の指定が必要です。
赤で色付
デフォルトの緑で色付
青で色付

参考情報

Qt Modules Maturity Level