午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPF、PolylineをぴったりサイズのBitmapSourceとして取得できた!PolylineよりPath使った方がいい

わかったのは、直線描画でもPathPolylineよりPathを使った方がいい。図形描画はPath

結果

デザイナー画面
頂点座標Points="40,0 0,100 100,0"を回転+拡大表示されたPolyline

BitmapSourceVisualizerで確認
これをコピーして

Pixtack紫陽花
貼り付けてサイズ確認
図形ピッタリサイズで画像取得できた!


ぴったりサイズ(Rect)の取得

前回の記事の通り、Polylineから直接…はできなかったけど
PathならPolylineと全く同じ表示ができるし、ぴったりサイズも取得できることがわかって

PolylineSegmentのPath(左)とPolyline(右)
SegmentにはBezier曲線もあるのでPathは汎用性が高いから、最初からPathを使えばいい

環境

コード

github.com

PathからBitmapSource

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から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にするなら、この方法が良い