none
描画する図形分のエリアに対してDrawXXXメソッドを行うと欠ける場合がある。欠けないようにするには? RRS feed

  • 質問

  • VisualStudio 2017 .Net 4.7.2 Windows10

    上記の環境化で、指定されたサイズの図形を作成し、図形分のBitmapエリアを用意して

    任意のpictureboxに表示するということを行いたいのですが、図形分のbitmapエリアを用意して描画した場合

    四辺の何れかが欠ける場合があります。かけない場合もあります。

    欠けないように描画するには+1pointなど固定値で微調整が必要なのでしょうか?

    DrawPolygon(PointF)の場合は、底辺が欠ける場合があります。

    DrawElipceまたはDrawArc(RectangleF)の場合は、左辺、上辺、下辺、右辺がそれぞれ欠ける場合があります。

    基本的に0.0f, 0.0fの左上から書いています。

    必ず欠けるならわかるのですが、欠ける場合の円、欠けない場合の円などがあるのでfloat型を使うことによっての

    誤差でかけてるのでしょうか?

    Bitmapを生成する場合は、Bitmapはint型なので若干大きくなるようにしています。

    例えば、円の場合

    float width = 15.5f;

    float height = 15.5f;

    Bitmapは整数型でしか初期化できないので、切り上げして大きめに確保しています。

    new Bitmap((int)Math.Ceiling(width), (int)Math.Ceiling(height));

    追記)

    Polygonの場合は、bitmapに幅+1、高さ+1で見きれない

    Elipceの場合は、描画位置を0,0から1,1に変更し、bitmapに+1,+1で見切れないが

    小さい円だと右端の先端が若干かける場合がある。

    ※小さい円で若干欠ける問題は

     

                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.PixelOffsetMode = PixelOffsetMode.HighQuality;

    を指定すると問題なし。

    です。






    • 編集済み mogja 2019年8月7日 7:01 修正
    2019年8月7日 5:38

回答

  • 欠けるというのは、1ピクセルレベルでの範囲でしょうか?

    アンチエリアスを指定すると問題なくなるということですので、恐らく誤差のレベルかと思います。画面上では1ピクセル単位で色が塗られるので、小さな円などは、どうしても奇麗に描画出来ずいびつな形になったりします。

    • 回答としてマーク mogja 2019年8月8日 0:59
    2019年8月7日 8:34

すべての返信

  • 欠けるというのは、1ピクセルレベルでの範囲でしょうか?

    アンチエリアスを指定すると問題なくなるということですので、恐らく誤差のレベルかと思います。画面上では1ピクセル単位で色が塗られるので、小さな円などは、どうしても奇麗に描画出来ずいびつな形になったりします。

    • 回答としてマーク mogja 2019年8月8日 0:59
    2019年8月7日 8:34
  • すみません。確認しながら記載していたため自分でもうまく整理がついていませんでした。

    (解決済みの問題点:質問時には不明でしたが、自己解決)

    1.△などの多角形描画時、底辺がかけて^のような描画になる

    →アンチエイリアスの指定により解決。

    2.〇を描画時、右・下の描画がかけて、Cみたいな描画になる

    →アンチエイリアスの指定により解決。

    3.〇を描画時、左・上の描画がかけて表示される。

    →描画位置を、0, 0ではなく、1, 1で解決

    このうち、3に関してですが、円を書くときは0,0で書かず、1, 1など0以外を開始にすべきなんでしょうか?

    円の直径の指定は15.5などのサイズなので、そこまで小さくはないと思うのですが・・・。

    2019年8月7日 8:51