GDI+ を使用した描画時に、予期せぬ描画結果となる

現象

GDI+ において、Graphics.ScaleTransform メソッドによるオブジェクトのスケーリングを行った上でカスタム線種により破線を描画すると、予期せぬ描画結果となる場合があります。具体的には、ピッチが短くなったり、各点が丸みを帯びた形状になったりします。また、線幅を 0 とすると線がつながったように見えることがあります。

原因

この現象は、GDI+ における想定された動作であり、GDI+ の描画アルゴリズムによって発生します。 
GDI+ では、Graphics.ScaleTransform メソッドにより拡大縮小が行われる場合、Graphics オブジェクトのプロパティやピクセルの情報などを基に最終的な描画結果を計算します。しかしながら、その計算の結果により破線の隙間や線の太さなどが変化し、描画結果が変化する場合があります。
なお、本動作は、GDI+ の描画アルゴリズムに基づく仕様上の動作です。

解決方法

本動作を回避するためには、想定される描画結果に近づくように、プロパティなどを調整する必要があります。
GDI+ の描画アルゴリズムについては公開されておらず、また、描画される線によっても結果が異なるため、どの場合にも対処できるような方法はありません。
たとえば、 以下のような方法があります。

  • Pen の色に対するアルファ値を変更する。
    Pen pen(Color(250, 255, 0, 0), 0);
  • Graphics.SmoothingMode プロパティを SmoothingModeAntiAlias へ変更する。
    Graphics.SetSmoothingMode(SmoothingModeAntiAlias);

状況

本動作は、GDI+ の描画アルゴリズムに基づく仕様上の動作です。

詳細


.NET Framework の System.Drawing.Graphics クラスは、GDI+ の機能をカプセル化しているため、本問題の影響を受ける場合があります。

GDI+ については、以下の技術情報を参照してください。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms533798.aspx
プロパティ

文書番号:2821906 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック