DCに文字列を描画しようとしています(グラフィックス-C#を使用しています)-しかし、描画されたテキストを画像から「削除」して、残されたものが基本的にテキストの切り抜きになるようにします。
透明なブラシでDrawStringを使用した場合、明らかに何も起こりませんでした。
そのようなものを描く方法はありますか、それとも2つのDCとBitBltをNOTやXORなどの組み合わせで使用する必要がありますか(私は何年も前に同様のことをしましたが、もっと簡単な方法があるかどうか疑問に思っていました)?
DCに文字列を描画しようとしています(グラフィックス-C#を使用しています)-しかし、描画されたテキストを画像から「削除」して、残されたものが基本的にテキストの切り抜きになるようにします。
透明なブラシでDrawStringを使用した場合、明らかに何も起こりませんでした。
そのようなものを描く方法はありますか、それとも2つのDCとBitBltをNOTやXORなどの組み合わせで使用する必要がありますか(私は何年も前に同様のことをしましたが、もっと簡単な方法があるかどうか疑問に思っていました)?
画像から 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 の作成はオプションですが、特に変換を使用する場合は、カプセル化が容易になることに注意してください。
あなたは試してみたいかもしれません:
// g is your Graphics object
using (var path = new GraphicsPath())
{
path.AddString(.... );
g.Clip.Exclude(path);
}
// Do your other painting here
このように聞こえると、新しい画像を作成し、その上に古い画像を描画する必要がある場合があります。私はあなたの状況について確信が持てません。
Graphics.CompositingMode-に設定できますがCompositingMode.SourceCopy、それが透明なコンテンツで機能するかどうかはわかりません。
これを回避する方法は次のとおりです。
速度が問題ではなく、小さなビットマップを扱う場合は、 メソッドGetPixelとSetPixelメソッドを使用できます。ただし、直接LockBitsアクセスBitmapDataしてバイト配列内のピクセルを処理するために使用することをお勧めします。これは高速で実装がそれほど難しくないソリューションですが、「安全でない」コードを処理する (またはMarshalクラスを使用する) 必要があります。
クイック検索では、残念ながら System.Drawing が XOR 描画をサポートしているようには見えず、GDI+ へのアンマネージ呼び出しを使用する必要があります。同様の質問に対するこの回答は、その方法を説明しているページにリンクしています。興味深いファイルはこちらです。
お役に立てれば。