3

DCに文字列を描画しようとしています(グラフィックス-C#を使用しています)-しかし、描画されたテキストを画像から「削除」して、残されたものが基本的にテキストの切り抜きになるようにします。

透明なブラシでDrawStringを使用した場合、明らかに何も起こりませんでした。

そのようなものを描く方法はありますか、それとも2つのDCとBitBltをNOTやXORなどの組み合わせで使用する必要がありますか(私は何年も前に同様のことをしましたが、もっと簡単な方法があるかどうか疑問に思っていました)?

4

4 に答える 4

3

画像から sth を切り取りたい場合は、次のようにします。

Drawing2D.GraphicsContainer c = graphics.BeginContainer();
GraphicsPath p = new GraphicsPath();

p.AddString(...);

graphics.SetClip(p, CombineMode.Xor);
graphics.DrawImage(this.Image, this.Location);

graphics.EndContainer(c);

上記のソリューションに似ていますが、まず SetClip がないと Graphics-Object が更新されず、次に Xor を使用する必要があります。

GraphicsContainer の作成はオプションですが、特に変換を使用する場合は、カプセル化が容易になることに注意してください。

于 2011-11-14T14:07:42.533 に答える
2

あなたは試してみたいかもしれません:

// g is your Graphics object
using (var path = new GraphicsPath())
{
    path.AddString(.... );
    g.Clip.Exclude(path);
}
// Do your other painting here

このように聞こえると、新しい画像を作成し、その上に古い画像を描画する必要がある場合があります。私はあなたの状況について確信が持てません。

于 2011-05-26T02:24:29.403 に答える
0

Graphics.CompositingMode-に設定できますがCompositingMode.SourceCopy、それが透明なコンテンツで機能するかどうかはわかりません。

これを回避する方法は次のとおりです。

  1. 黒の背景に赤いブラシを使用して、別の画像にテキストを描画します。
  2. テキスト画像とターゲット画像の各ピクセルを反復処理...
  3. ...テキストの画像の赤のコンポーネントに従って、ターゲット画像のピクセルの色のアルファ値を手動で設定します。

速度が問題ではなく、小さなビットマップを扱う場合は、 メソッドGetPixelSetPixelメソッドを使用できます。ただし、直接LockBitsアクセスBitmapDataしてバイト配列内のピクセルを処理するために使用することをお勧めします。これは高速で実装がそれほど難しくないソリューションですが、「安全でない」コードを処理する (またはMarshalクラスを使用する) 必要があります。

MSDN の LockBits リファレンス

MSDN のマーシャル リファレンス

于 2011-08-19T08:17:33.620 に答える
0

クイック検索では、残念ながら System.Drawing が XOR 描画をサポートしているようには見えず、GDI+ へのアンマネージ呼び出しを使用する必要があります。同様の質問に対するこの回答は、その方法を説明しているページにリンクしています。興味深いファイルはこちらです。

お役に立てれば。

于 2011-05-26T01:03:32.093 に答える