- 題名: 2つのPictureの重複部分の塗りつぶし
- 日時: 2012/12/12 17:14:54
- ID: 31170
- この記事の返信元:
- (なし)
- この記事への返信:
- [31171] Re[1]: 2つのPictureの重複部分の塗りつぶし2012/12/12 18:30:45
- ツリーを表示
■No31172に返信(ぶぶさんの記事)
>>http://www.java2s.com/Tutorial/VB/0300__2D-Graphics/RegionIntersect.htm
> より、四角形の重複部分の塗りつぶしについては、ヒントを得ましたが、
> これが多角形になった場合が
GraphicsPath クラスで多角形のパスを作り、それを Region に渡せば OK です。
GraphicsPath のサンプルは、このあたりを参考にしてみてください。
http://dobon.net/vb/dotnet/graphics/drawpath.html
http://uchukamen.com/Programming1/Region/index.htm
また、GraphicsPath のメソッドをそれぞれ使う代わりに、
「New GraphicsPath( Point配列, PathPointType配列 )」
のコンストラクタを使って作成することもできます。
以下、GraphicsPath で多角形を作るサンプル。
同じ大きさの PictureBox を 2 つ並べて配置し、
背景色を変更するか画像を貼るかしておいてください。
PictureBox1 上の任意の座標をクリックしていくと、
PictureBox2 がその座標から構成される多角形に切り抜かれます。
'---------------
Imports System.Drawing.Drawing2D
Public Class Form1
Private points As New List(Of Point)() 'クリックされた位置を保存する変数
Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
points.Add(e.Location)
If points.Count >= 3 Then
Dim types = Enumerable.Repeat(CByte(PathPointType.Line), points.Count)
'★「New GraphicsPath( Point配列, PathPointType配列 )」の呼び出し
Using gpath As New GraphicsPath(points.ToArray(), types.ToArray())
'☆ GraphicsPath から多角形の Region を作成
Dim newRegion As New Region(gpath)
Dim oldRegion = PictureBox2.Region
PictureBox2.Region = newRegion
If oldRegion IsNot Nothing Then
oldRegion.Dispose()
End If
End Using
End If
End Sub
End Class
■No31176に返信(ぶぶさんの記事) > つたないコードですが、どうしていいかわからなかった状態から > ここまでこれてほっとしました。 補足。 使い終わった描画オブジェクト(Graphics、GraphicsPath、Region 等)は 最後に「Dispose メソッド」を呼び出して、後始末するべきです。 (もしくは Dispose が自動的に呼ばれるよう、Using ブロックを使います) 同様に、Bitmap も本来であれば Dispose すべき対象ですが、 今回のコードではまだ使い終わっておらず、最後に > ' ----- 画像を表示する > PictureBox1.Image = canvas として使用されているため、こちらは Dispose してはいけません。
分類:[.NET]
方法がわからないので、教えてください。
塗りつぶされた図形を書いているPictureが2つあります。
この図形を重ねて、重複した部分のみ塗りつぶした新たなPictureを
つくりたいのですが、方法が思いつきません。
ヒントでも構いません。よろしくお願いいたします