6

SmoothingModeを変更することはできPowerPacks.LineShapeますか?

私はこのコード(継承するクラスLineShape)を使用しようとしました:

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics   

    ' no difference when changing the SmoothingMode ' 
    g.SmoothingMode = SmoothingMode.AntiAlias 

    Using pen As New Pen(Color.Blue, 3)
      g.DrawLine(pen, X1, Y1, X2, Y2)
    End Using

    ' MyBase.OnPaint(e) '
  End Sub

私はいつも同じ結果になります: alt text http://lh6.ggpht.com/_1TPOP7DzY1E/S3v1IbxlbCI/AAAAAAAADD4/q1Y9kP8wJ0g/s800/Capture2.png

=======

編集

テストを更新しました:

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics

    Dim oldmode As SmoothingMode = g.SmoothingMode

    Using pen As New Pen(Color.Blue, 3)
      g.SmoothingMode = SmoothingMode.AntiAlias
      g.DrawLine(pen, X1, Y1, X2, Y2)
      g.SmoothingMode = SmoothingMode.None
      g.DrawLine(pen, X1 + 50, Y1, X2 + 50, Y2)
    End Using

    g.SmoothingMode = oldmode
    g.Flush()

    'MyBase.OnPaint(e)'
  End Sub

結果(ラベルや円は考慮しないでください):

代替テキストhttp://lh3.ggpht.com/_1TPOP7DzY1E/S447qYvTqzI/AAAAAAAADE8/eP3kCLqQJbk/s800/Capture2.png

どうやらスムージングモードは考慮されていません...

4

4 に答える 4

4

SmoothingModeは間違いなく出力に影響を与えるはずです

品質の低下を最小限に抑えて画像のサイズを変更するために最近使用した設定は次のとおりです。

graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

InterpolationModeはおそらくあなたの例には関係ありませんが、PixelOffsetModeは関係があるかもしれません。簡単なテストアプリを起動します。

更新:これがクイックテストアプリです。SmoothingModeは間違いなく私が描く線に影響を与えます。

private void Form1_Load(object sender, EventArgs e)
{
    foreach (var value in Enum.GetValues(typeof(SmoothingMode)))
    {
        _ComboBoxSmoothingMode.Items.Add(value);
    }

    foreach (var value in Enum.GetValues(typeof(PixelOffsetMode)))
    {
        _ComboBoxPixelOffsetMode.Items.Add(value);
    }

    _ComboBoxPixelOffsetMode.SelectedIndex = 0;
    _ComboBoxSmoothingMode.SelectedIndex = 0;
}

private void _ButtonDraw_Click(object sender, EventArgs e)
{
    using (Graphics g = _LabelDrawing.CreateGraphics())
    {
        g.Clear(Color.White);

        if (_ComboBoxPixelOffsetMode.SelectedItem != null && (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem != PixelOffsetMode.Invalid)
        {
            g.PixelOffsetMode = (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem;
        }

        if (_ComboBoxSmoothingMode.SelectedItem != null && (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem != SmoothingMode.Invalid)
        {
            g.SmoothingMode = (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem;
        }

        using (Pen pen = new Pen(Color.Blue, 3))
        {
            g.DrawLines(pen, new[] { new Point(0, 0), new Point(25, 50), new Point(_LabelDrawing.Width - 25, _LabelDrawing.Height - 50), new Point(_LabelDrawing.Width, _LabelDrawing.Height), });
        }
    }
}

SmoothingMode:アンチエイリアスなし

SmoothingMode.AntiAlias http://www.ccswe.com/temp/SmoothingMode_AntiAlias.png SmoothingMode.None http://www.ccswe.com/temp/SmoothingMode_None.png

更新: Morboが指摘したように、Graphicsで提示されたオブジェクトが、最終的に表示に使用されるオブジェクトとPaintEventArgs同じでないGraphics場合、スムージングを変更しても効果がない可能性があります。Graphicsそれが記憶Imageか何かからのオブジェクトであるならば、私はそのような劇的な違いを期待しませんが。

もっと提供できたらいいのに。LineShapeGraphics.DrawLine()メソッドの1つを使用するだけでなく、何があなたに何を与えているのか、そしてそれを使用する理由をよりよく理解できればと思います。

の使用に疑問を呈する理由は、LineShapeOnPaintをオーバーライドして、独自の線を描画しているためです。アプリケーションを単純化して捨てることができるようですが、LineShape何かが足りないのかもしれません。


更新:LineShapeわかりました。なぜthenを使用しているのかは理にかなっています。この時点で私が提供できる唯一の提案は、パネルまたはLineShapeのOnPaintをオーバーライドし、ベースイベントを呼び出す前にそこでスムージングモードを設定してみることです。何かのようなもの:

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
    base.OnPaint(e);
}
于 2010-02-26T17:22:18.593 に答える
2

Reflectorでわかることから、PowerPack LineShapeコンポーネントは、コンテナーの元のPaintイベントのGraphicsオブジェクトを使用してペイントします。与えられたGraphicsオブジェクトのプロパティを変更すると、シェイプの後にペイントするコンテナ内の他のすべてに影響を与える可能性があります。

サンプルに含まれているLineShapeオブジェクトは何ですか?(カスタムペイントされたコントロールの場合、ある時点でビットマップを作成しますか?どのように?)色深度の低いカスタムコントロール内にある場合は、それが問題の原因である可能性があります。LineShapeは、私のマシンではデフォルトでアンチエイリアスを描画します。

于 2010-02-26T17:47:02.717 に答える
2

表示設定は何に設定されていますか?少なくとも24ビットカラー?

LineShapeからクラスを派生させ、あなたが示したようにOnPaintをオーバーライドすることは、実際には期待どおりにラインレンダリングに影響を与えることを確認できます。また、PowerPack3.0とVisualStudio2010のバージョンの両方が、LineShape.DrawInternalメソッドで特にAntiAliasを使用していることを確認できます。

空白の.NET2.0Windowsフォームアプリから始めました。次のクラスを追加しました。これは、あなたのクラスとほぼ同じであり、ShapeContainerと斜めのMyLineシェイプのみを含むフォームです。

Imports Microsoft.VisualBasic.PowerPacks

Public Class MyLine
    Inherits LineShape

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

        Dim g As Graphics = e.Graphics

        'g.SmoothingMode = SmoothingMode.AntiAlias '

        Using pen As New Pen(Color.Blue, 3)
            g.DrawLine(pen, X1, Y1, X2, Y2)
        End Using

        'MyBase.OnPaint(e) '

    End Sub

End Class

上記のコードをそのまま使用してプロジェクトを実行すると、行はエイリアス(ギザギザ)になります。SmoothingMode設定のコメントを外すと、ラインはアンチエイリアス(スムーズ)になります。

だからそれは間違いなく動作するはずです。ばかげた質問のように思えますが、デバッガーでコードがヒットしていることを確認しましたか?DrawLineの直後にGraphics.Flush()を呼び出してみましたか?

また、どのバージョンのPowerPackを使用していますか?私が言ったように、LineShape.DrawInternalがtry/finallyブロックでSmoothingModeをAntiAliasに具体的に設定していることがReflectorではっきりとわかります。戻る前に古いスムージングモードを復元します。しかし、あなたの例では、baseメソッドを呼び出していないので、これをヒットすることはありません。

于 2010-03-03T05:59:37.707 に答える
0

質問は私の開発モードでした:仮想PC上のリモートデスクトップ接続を介して。

私の場合、RDCはAntiAliasグラフィックスプロパティを考慮していません。

詳細:Virtual PCでの開発に問題がありましたか?

参加してくれた皆さんに感謝します。申し訳ありませんが、それは実際には.NETの問題ではありませんでした。

于 2010-03-03T16:47:17.223 に答える