0

私は PyQt を使用しており、ディスクからQPixmap. 以下を使用して、マスクも作成しました。

self.mask = QImage(self.image.width(), self.image.height(), QImage.Format_Mono)
self.mask.fill(0)

表示用に 2 つを組み合わせて、レンダリング時にマスク内の黒く着色されたピクセルが画像上に半透明の赤で描画されるようにします。

次のように、ペイント イベントで画像をレンダリングするカスタム ウィジェットを作成しました。

def paintEvent(self, event):
    p = QPainter(self)
    r = event.rect()

    p.drawPixmap(r, self.image, r)

これはうまくいきます。私があまりはっきりしていないのは、マスク内のデータを取得し、宛先イメージ内のそれらのピクセルのみに半透明の赤をペイントする方法です。

次のように、マスクをクリッピング領域に変えてみました。

mask = QPixmap.fromImage(self.mask.createMaskFromColor(self.mask.color(0)))
p.setClipRegion(QRegion(mask))

color = QColor(255, 0, 0, 128)
p.setPen(Qt.NoPen)
p.setBrush(QBrush(color))
p.drawRect(r)

...しかし、何も描画しません (また、 を呼び出さないと、画像全体に半透明の赤いボックスが描画されますsetClipRegion)。

また、マスクを として作成し、QImage.Format_ARGB4444_Premultiplied透明度を使用してみました。これは機能し、プログラムでマスクを編集できますが (マスクの一部が透明で一部が不透明であることを確認します)、self.mask.createAlphaMask()メソッドは真っ白な四角形を返します。

「マスクの作成」メソッドは実際に何かをしますか?

4

1 に答える 1

2

マスクのデザインを変更するか、マスクに基づいて新しいQImageを作成します。次に、宛先にQImageを描画します。これは機能する方法であるだけでなく、単一のピクセルまたはsthを描画するよりも高速な方法でもあります。似ている。私はいくつかの方法を試しましたが、これはこれまでのところ(QGLWidgetで)最速でした。

アイデアは、次のように、QImageで透明度とマークされていないピクセルを直接エンコードすることです。

QImage dest(<width>, <height>, QImage::Format_ARGB32);
dest.fill(qRgba(0, 0, 0, 0));
for (int y = 0; y < <height>; ++y) {
    QRgb *destrow = (QRgb*)dest.scanLine(y);
    for (int x = 0; x < <width>; ++x) {
        if (<should be marked>)
            destrow[x] = qRgba(255, 0, 0, 127);
    }
}
painter.drawImage(0, 0, dest);

参考までに、ここのコードを見てください:

https://sourceforge.net/p/gerbil/svn/60/tree/trunk/gerbil-gui/bandview.cpp#l59

于 2012-11-01T00:42:00.893 に答える