2016/11/14(月) [n年前の日記]
#1 [python] PySideで消しゴムツール
Python + PySide で書いたお絵かきアプリモドキで消しゴムツールを実装できそうか実験。
なんとかできそうな感じになってきた。
_PySideを使って消しゴムツールを実現できそうかテスト - Gist
実行結果。
ちょっと分かりづらいけど、十字っぽいブラシ画像で、キャンバス相当の背景画像の一部を消去できていることが分かる、かなと。かつ、ブラシ画像のアルファチャンネルもそれっぽく反映されてる。
関係ありそうなところだけ抜き出してみると…。
QPainter.setCompositionMode() を使って、描画する時の合成モードを指定できる。
_QPainter - PySide v1.0.7 documentation
_Composition Modes
それぞれどういう効果があるのか、どっちを Source にして、どっちを Destination にすればいいのか、ちょっとよく分からんけど…。色々試してたら、上記のような記述で消しゴムツールっぽい描画になってくれた。
ドキュメントには「QImageじゃないと働かないよ」と書いてあるようにも思えたけど、Windows10 x64 + Python 2.7.12 + PySide 1.2.4 では、QPixmapを指定しても動いてしまったように見える。けど、これでいいのだろうか。自信無し。
なんとかできそうな感じになってきた。
_PySideを使って消しゴムツールを実現できそうかテスト - Gist
実行結果。
ちょっと分かりづらいけど、十字っぽいブラシ画像で、キャンバス相当の背景画像の一部を消去できていることが分かる、かなと。かつ、ブラシ画像のアルファチャンネルもそれっぽく反映されてる。
関係ありそうなところだけ抜き出してみると…。
def erase_brush_pixmap(self): u"""ブラシ画像(QPixmap)を消しゴムとして使う.""" qp = QPainter() qp.begin(self.canvas) qp.setCompositionMode(QPainter.CompositionMode_DestinationOut) x, y = self.brush.width() + 16, 0 qp.drawPixmap(x, y, self.brush) qp.end() del qp self.canvas_item.setPixmap(self.canvas)
QPainter.setCompositionMode() を使って、描画する時の合成モードを指定できる。
_QPainter - PySide v1.0.7 documentation
_Composition Modes
それぞれどういう効果があるのか、どっちを Source にして、どっちを Destination にすればいいのか、ちょっとよく分からんけど…。色々試してたら、上記のような記述で消しゴムツールっぽい描画になってくれた。
ドキュメントには「QImageじゃないと働かないよ」と書いてあるようにも思えたけど、Windows10 x64 + Python 2.7.12 + PySide 1.2.4 では、QPixmapを指定しても動いてしまったように見える。けど、これでいいのだろうか。自信無し。
[ ツッコむ ]
以上です。