任意の図形でRegionやGraphicsPathを作るには?

タグの編集
投稿者 ねこまっしぐら  (社会人) 投稿日時 2017/11/26 11:54:17
VB.net2005 Windows7 WinFormsです
画像をクリップしたいのですが、矩形なら回転してもポリゴンでRegionなりGraphicsPathなりは作れますが、回転した楕円とか自由曲線図形の場合どのようにすればいいのでしょう
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/11/26 21:33:52
自由曲線なら AddClosedCurve を使う手も一応あります。
https://dobon.net/vb/dotnet/form/formregion.html#section5

ただ自分の場合は、適当なポリゴンに分解して
それを Union で繋ぎあわせることで生成していますね。

下記に同種のサンプルがあります。
前者は VB による .NET 実装、後者は C++ による Win32 実装。
http://smdn.jp/programming/tips/create_region_from_bitmap/
http://marupeke296.com/TIPS_No11_AutoRegion.html
投稿者 ねこまっしぐら  (社会人) 投稿日時 2017/11/27 12:57:48
魔界の仮面弁士様、いつもありがとうございます

実はそもそも私のポカで、なぜだかGraphicsPathが変形出来ないと思いこんでいたのが原因でした
Transformで拡大縮小も回転も出来たのが分かって恥ずかしい限りです(^^;

ただピクセルをRegionに出来るってのは何かに使えるかもしれませんね

と、そこまでは良かったのだけど、弧や直線寄せ集めて作ったGraphicsPathをDrawPathすると線の繋ぎ目を結ぶ線が勝手に入って困ったことに…
輪郭線だけが欲しいのに…
(そしてそのGraphicsPathでClipした画像も歯抜けに…)
投稿者 ねこまっしぐら  (社会人) 投稿日時 2017/11/28 12:37:40
試行錯誤してたらさらに分からないことが…
位置がずれるので色々試していたら
GraphicsPath.AddEllipse(New Rectangle(0,0,100,100))だと
GraphicsPath.GetBoundsは0,0,100,100なのに
GraphicsPath.AddPie(New Rectangle(0,0,100,100),135,180)だと
GraphicsPath.GetBoundsは-4.881555,-4.88157,90.23682,90.23689を返してきます
(期待しているのは0,0,85.35534,85.35534)
このマイナスはどこから…
投稿者 ねこまっしぐら  (社会人) 投稿日時 2017/11/29 18:13:30
結局Add~する時にintegerだったのをsingleにしたら隙間が無くなったようなので取りあえず解決にします
(ずれるのもそのマイナス分よけいに拡大して何とかしましたし)