WPF、PolylineをぴったりサイズのBitmapSourceとして取得できた!PolylineよりPath使った方がいい
わかったのは、直線描画でもPathPolylineよりPathを使った方がいい。図形描画はPath
結果
頂点座標Points="40,0 0,100 100,0"を回転+拡大表示されたPolyline
これをコピーして
貼り付けてサイズ確認
図形ピッタリサイズで画像取得できた!
ぴったりサイズ(Rect)の取得
前回の記事の通り、Polylineから直接…はできなかったけど
PathならPolylineと全く同じ表示ができるし、ぴったりサイズも取得できることがわかって
SegmentにはBezier曲線もあるのでPathは汎用性が高いから、最初からPathを使えばいい
環境
- Windows 10 Home バージョン 21H2
- Visual Studio Community 2022 Version 17.5.1
- WPF
- C#
- .NET 6.0
コード
PathからBitmapSource
対象PathのDataプロパティ(Geometry型)取得、これにはStrokeThickness(線の太さ)やTransform(変形)が指定されていないので、それぞれ指定していく
GetWidenedPathGeometryメソッドで線を広げたPathGeometryが取得できる、これのTransform(変形)プロパティに対象PathのRenderTransformを指定で、目的のサイズ(Rect)をもったPathGeometry完成で、RectはBoundsプロパティから取得
あとは前回とほとんど同じ
DrawingVisualで描画するのはさっきのPathGeometry
描画する位置のオフセット、これはDrawingVisual自体をオフセットする
RenderTargetBitmapのサイズ指定での+1.0は、切り上げ処理をしている
これでPathからBitmapSourceを取得することはできるようになった、次はPolyline
PolylineからBitmapSource
PolylineからPathGeometryを作成して、あとはさっきのと同じ
ちょっと違うのはFill(塗りつぶし)にも対応したところ
Stroke(線)とFill(塗りつぶし)それぞれのPathGeometryを作成
Fill用はもとのPolylineのPointsから作成
Stroke用は、Fill用のGetWidenedPathGeometryメソッドから作成
描画サイズはStroke用から取得、オフセットの値もStroke用を使ったら期待どおりになった
描画の順番はFillが先、その後(上)にStrokeを重ね書き
感想
Polylineからって言っても実質PathGeometryを一から作成して、それを描画しているし、Polylineと同じ表示もできるし、ベジェ曲線も表示もできるし
もう全部あいつ(Path)一人でいいんじゃないかな
最後までわからなかったのは描画のオフセット!
Geometryから太さ考慮、変形考慮してのRect取得までは良かったのに、描画する位置の指定をどこでするのかがわからなかった。最初は普通に描画するところ、Contextやその描画メソッドのDrawGeometryのTransformのTranslateTransformでオフセットしようとしたけど、どうしてもずれる!
個人的なイメージとしては
DrawingVisualは絵を描く画用紙やキャンバス
ContextでDrawするのは描画する対象そのもの
こうだったから、まさか画用紙自体をオフセットするとは!
つまりはこのイメージが間違っているのかもしれんw
関連記事
次回は1ヶ月後
gogowaten.hatenablog.com
前回は一昨日
gogowaten.hatenablog.com
図形以外をBitmapSourceにするなら、この方法が良い