アルファ値・色を維持したままFillRectangleを重ねるには?

解決


eXor  2006-03-29 03:25:18  No: 130823

VB.NET2003です。

□□_
□□□
_□□
上図のように、複数の長方形を重ねた図形を作ろうとしています。
複数の長方形は全て同じARGB値で、重なる部分も同じARGB値にしたいと思っています。
(図が完成した後、ほかのBitmapに重ね合わせるため)

そのため、下記のようなコードを書いてみたのですが、

Dim TestBitmap As Bitmap = New Bitmap(500, 500, Imaging.PixelFormat.Format32bppArgb)
Dim sb As SolidBrush = New SolidBrush(Color.FromArgb(128, 0, 0, 255))
Dim g As Graphics = Graphics.FromImage(TestBitmap)

g.FillRectangle(sb, 100, 100, 200, 200)
g.FillRectangle(sb, 200, 200, 200, 200)

□□_
□■□
_□□
このように重なり合う場所だけARGB値も重ねあわされて変わってしまいます。
うまい解決法等ありましたら、教えていただけませんか?


eXor  2006-03-29 04:02:11  No: 130824

自己解決しました。

Dim TestBitmap As Bitmap = New Bitmap(500, 500, Imaging.PixelFormat.Format32bppArgb)

Dim cms() As Imaging.ColorMap = {New Imaging.ColorMap}
cms(0).OldColor = Color.FromArgb(255, 0, 0, 255)
cms(0).NewColor = Color.FromArgb(128, 0, 0, 255)

Dim ia As New System.Drawing.Imaging.ImageAttributes
ia.SetRemapTable(cms)

Dim sb As SolidBrush = New SolidBrush(cms(0).OldColor)
Dim g As Graphics = Graphics.FromImage(TestBitmap)

g.FillRectangle(sb, 100, 100, 200, 200)
g.FillRectangle(sb, 200, 200, 200, 200)

と、最初は不透過色で描いてから、DrawImageの際に色を透過色に変換することで解決しました。

なお、解決チェックはつけますが、よりスマートな方法がありましたらご教授ください。


魔界の仮面弁士  2006-03-29 21:14:35  No: 130825

> □□_
> □□□
> _□□
> 上図のように、複数の長方形を重ねた図形を作ろうとしています。

『_』の部分が良く分からずに、理解が遅れました。m(_ _)m
(7個の長方形を並べているように見えていたので…)

2 つの矩形を、斜めに重ね合わせたイメージだったのですね。
┏━┓     ┏━┓    
┃┌╂┐  ┃   ┗┓
┗┿┛│  ┗┓   ┃
   └─┘     ┗━┛

下記のように、GraphicsPathを使ってみては如何でしょう?

Dim gp As New Drawing2D.GraphicsPath(Drawing2D.FillMode.Winding)
gp.AddRectangle(New Rectangle(100, 100, 200, 200))
gp.AddRectangle(New Rectangle(200, 200, 200, 200))

g.Clip = New Drawing.Region(gp)
g.FillRectangle(sb, TestBitmap.GetBounds(GraphicsUnit.Pixel))


eXor  2006-03-29 23:20:28  No: 130826

試したところ、うまく長方形を重ねた形が描けました。
スマートな方法、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加