6

描画タブレットと対話するペイント プログラムの作成を開始しました。タブレット上のペンの圧力に応じて、描画される線のアルファ値を変更します。その仕組みが働いています。

細い線はまともに見え、本物のスケッチに見えます。しかし、ペイントするために (Qt の落書きチュートリアルのように) 2 つの点の間に線を描いているので、線の継ぎ目の間にアルファ オーバーラップがあり、太いストロークでは非常に目立ちます。

これは、行から行への結合による効果です。

ご覧のとおり、線分の間に醜いアルファ ブレンドがあります。

これを解決するために、 a を使用QPainterPathして線をレンダリングすることにしました。これには2つの問題があります:

  1. 長く連続した太いパスは、プログラムをすぐに遅らせます。
  2. パスは接続されているため、パスは 1 つとして機能するため、アルファ値を変更するとパス全体に影響します (ブレンド効果を維持したいので、これは望ましくありません)。

次の画像ではQPainterPath.

残しておきたいブレンド効果。

次の画像は、パス全体のアルファと太さを変更する 2 番目の問題を示しています。ここに画像の説明を入力

赤いテキストは次のようになります。「ペンをタブレットの表面から離さずに圧力を加えると、線が太くなります」(アルファが不透明になります)

もう 1 つのことは、このアプローチでは、暗い部分から明るい部分 (または太い部分から細い部分) へのブレンド トレイルしか得られず、明るい部分から暗い部分へのブレンド トレイルは得られないことです。この効果が発生する理由はわかりませんが、パスの線分が全体として更新されることに関係しているのではないかと推測されます。

タブレット上のペンの圧力に基づいて、プログラムでアルファと線の太さを増減させました。

問題は、アルファ オーバーラップなしで線をレンダリングし、望ましくないQPainterPathパス全体のアルファと太さを更新することです。

パスを作成するコードは次のとおりです。

    switch(event->type()){
    case QEvent::TabletPress:
        if(!onTablet){
            onTablet = true;

            //empty for new segment
            freePainterPath();
            path = new QPainterPath(event->pos());
        }   break;

    case QEvent::TabletRelease:
        if(onTablet)
            onTablet = false;
            break;

    case QEvent::TabletMove:
        if(path != NULL)
            path->lineTo(event->pos());

        if(onTablet){

            //checks for pressure of pen on tablet to change alpha/line thickness
            brushEffect(event);

            QPainter painter(&pixmap);

            //renders the path
            paintPixmap(painter, event);
        }   break;
    default:;
}
update();

単一のパスとして必要な効果 (Krita ペイント プログラムで作成された画像):ここに画像の説明を入力

4

2 に答える 2

5

この質問は非常に古く、受け入れられた回答があることは知っていますが、他の誰かが回答を必要とする場合は、次のとおりです。

ペインターの合成モードをソースに設定する必要があります。現在、ソースと宛先の両方を描画します。

painter.setCompositionMode(QPainter::CompositionMode_Source);

下にある描画を通して透明な領域を表示したい場合は、結果の構成モードを CompositionMode_SourceOver に戻し、宛先に描画する必要があります。

まだ答えを探しているかどうかはわかりませんが、これが誰かの役に立てば幸いです。

于 2015-02-01T12:40:45.293 に答える
4

Krita ペイント プログラムをエミュレートするには:

  1. 元のターゲット サーフェスのバックアップを保持します。
  2. 最初は完全に透明なスクラッチ サーフェスにブラシでペイントします。
  3. その表面では、堆肥化ルールは「最大の不透明度を取る」です。
  4. そのサーフェスの汚れた領域を追跡し、(スクラッチ サーフェス) を (元のターゲット サーフェス) に従来のように合成して、結果を表示します。この操作が元のターゲット サーフェスを損傷しないことを確認してください。

ここでは、元のターゲット サーフェス全体を保持する必要はありません。このツールで描画した部分だけを保持するだけです。(優れたタイル ベースの遅延書き込みイメージング システムを使用すると、これが簡単になります)。

描画するセグメントのサイズによっては、セグメント間を補間して、ブラシの強度を少し弱くすることができます。ブラシの形状も調整が必要な場合があります。しかし、これらは透明性の問題とは無関係です。

Qt の奇妙さについて言えば、Qt のブラシ コードのクセに対処する方法を説明できるほど、Qt について十分な知識がありません。しかし、上記の「キーマスク」戦略は、アルファ オーバーラップの問題を解決するはずです。

Qtでこれを行う方法がわかりません。Qt 合成モードをちらりと見てみると、結果のアルファとして「最大値を取得する」という明確な方法がわかりません。おそらく、何らかの巧妙な方法でカラー チャネルとアルファ チャネルの両方を含むものです。

于 2013-07-24T01:29:42.457 に答える