C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 【wpf】canvas範囲指定塗りつぶし


(過去ログ 134 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■79084 / inTopicNo.1)  【wpf】canvas範囲指定塗りつぶし
  
□投稿者/ のりっち (21回)-(2016/03/07(Mon) 08:17:04)

分類:[.NET 全般] 

wpfのcanvasの塗りつぶしについて、質問させて
下さい。
canvasで描画したline内を塗りつぶす方法は
ありますでしょうか。
polygonならfillを使えば塗りつぶせるのは
把握しているのですが、polygonだと指定した座標
とズレで描画される時があり、描画の正確性に不安が
あるため、lineで描画、塗りつぶしを検討
しております。
よろしくお願いします。
引用返信 編集キー/
■79111 / inTopicNo.2)  Re[1]: 【wpf】canvas範囲指定塗りつぶし
□投稿者/ ito (19回)-(2016/03/08(Tue) 16:28:18)
No79084 (のりっち さん) に返信
WPFのみでは無理かと思います。
ご存知と思いますが、WPFは線や円などのオブジェクト(Polygonもオブジェクトの1つ)を重ねて描画します。
これに対して塗りつぶすというオブジェクトは存在しません(私が知らないだけかも知れませんが)。

一方、画像として考えると、塗りつぶしは可能です(PhotoShopやペイントなどの所謂バケツツールは画像として処理されています)。
コードは長くなってしまうので、考え方だけ記載します。
(1)メモリビットマップを作成する
(2)メモリビットマップに線を描画する
(3)P/Invokeを使用して、ExtFloorFill-APIを呼び出す
(4)描画したくない背景部分のα値を調整する(背景部分が描画されないように、α=0をセットする)
(5)メモリビットマップをCanvasに描画する(おそらくCanvasを継承したカスタムコントロールが必要)

それよりは、
> polygonならfillを使えば塗りつぶせるのは
> 把握しているのですが、polygonだと指定した座標
> とズレで描画される時があり
こちらの現象を回避できないかを検討したほうが良いかと思われます。
再現コードを提示できますでしょうか?

引用返信 編集キー/
■79112 / inTopicNo.3)  Re[2]: 【wpf】canvas範囲指定塗りつぶし
□投稿者/ ito (20回)-(2016/03/08(Tue) 16:44:32)
No79111 (ito さん) に返信
> ■No79084 (のりっち さん) に返信
> これに対して塗りつぶすというオブジェクトは存在しません(私が知らないだけかも知れませんが)。
> これに対して塗りつぶすというオブジェクトは存在しません(私が知らないだけかも知れませんが)。
言葉足らずだったので、補足します。
円や矩形、ポリゴンを塗りつぶすオブジェクトは存在しますが、
描画されたデータを元にバケツツールのように塗りつぶすというオブジェクトは存在しません。

また、パスを塗りつぶすことで可能なように見えますが、これだと結局、元の「ポリゴンを塗りつぶす」と同じことになりそうな気がします。

引用返信 編集キー/
■79119 / inTopicNo.4)  Re[3]: 【wpf】canvas範囲指定塗りつぶし
□投稿者/ のりっち (22回)-(2016/03/09(Wed) 16:42:45)
No79112 (ito さん) に返信
> ■No79111 (ito さん) に返信
>>■No79084 (のりっち さん) に返信
ご回答ありがとうございます。
> polygonならfillを使えば塗りつぶせるのは
> 把握しているのですが、polygonだと指定した座標
> とズレで描画される時があり
>> こちらの現象を回避できないかを検討したほうが良いかと思われます。
>> 再現コードを提示できますでしょうか?
コードは単純にpolygonにpointを指定しているだけです。
ズレて描画される状況は、なかなか説明しずらいところではありますが、
三角形描画時で、3点でA(10,10),B(15,20),C(20,500)といった一つの点だけ
大きく特出していて、BCの角度が10度以下等、少ない値になる場合に発現します。

本来はABCの座標どおりにcanvasに描画されるところを、Cのところだけ見た目的に
C(20,520)といった感じに、指定した座標よりはみ出して描画されてしまいます。

原因は色々調査し、polygonの線の太さを小さくしたら、はみ出す量が少なくなったことから、
polygonで描画の線が重なった場合、WPF側で重ならないよう自動で調整が働いているのではないかと、
想定はしているのですが、想定の域はでていません。

上記事象が解消されれば、polygonでもいいと考えています。


引用返信 編集キー/
■79120 / inTopicNo.5)  Re[4]: 【wpf】canvas範囲指定塗りつぶし
□投稿者/ ito (21回)-(2016/03/09(Wed) 17:40:23)
No79119 (のりっち さん) に返信
> ■No79112 (ito さん) に返信
>>■No79111 (ito さん) に返信
> >>■No79084 (のりっち さん) に返信
> 三角形描画時で、3点でA(10,10),B(15,20),C(20,500)といった一つの点だけ
> 大きく特出していて、BCの角度が10度以下等、少ない値になる場合に発現します。
> 
> 本来はABCの座標どおりにcanvasに描画されるところを、Cのところだけ見た目的に
> C(20,520)といった感じに、指定した座標よりはみ出して描画されてしまいます。
もしかすると、「Polygon.StrokeLineJoin」が関係していませんでしょうか?
「StrokeLineJoin="Bevel"」にすると、はみ出しはなくなります。
"Miter"/"Round"だとはみ出しますが、これは仕様でしょう。

//---サンプルXAML
<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test"
    Width="800" Height="600">

    <Grid>
        <Canvas Width="800" Height="600">
            <Border Canvas.Left="0" Canvas.Top="0" Background="Black" Width="20" Height="500" />
            <Polygon Canvas.Left="0" Canvas.Top="0" 
                Stroke="Red"
                StrokeLineJoin="Bevel"
                StrokeThickness="10"
                Points="10,10 15,20 20,500"
                />
            <Border Canvas.Left="50" Canvas.Top="0" Background="Black" Width="20" Height="500" />
            <Polygon Canvas.Left="50" Canvas.Top="0"
                Stroke="Green"
                StrokeLineJoin="Miter"
                StrokeThickness="10"
                Points="10,10 15,20 20,500"
                />
            <Border Canvas.Left="100" Canvas.Top="0" Background="Black" Width="20" Height="500" />
            <Polygon Canvas.Left="100" Canvas.Top="0"
                Stroke="Blue"
                StrokeLineJoin="Round"
                StrokeThickness="10"
                Points="10,10 15,20 20,500"
                />
        </Canvas>
    </Grid>
</Window>

引用返信 編集キー/
■79121 / inTopicNo.6)  Re[5]: 【wpf】canvas範囲指定塗りつぶし
□投稿者/ のりっち (24回)-(2016/03/09(Wed) 18:11:35)
No79120 (ito さん) に返信
> ■No79119 (のりっち さん) に返信
>>■No79112 (ito さん) に返信
> >>■No79111 (ito さん) に返信
>>>>■No79084 (のりっち さん) に返信
ズバリはみ出さなくなりました。
丁寧に説明いただきありがとうございます!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -