2

滑らかなグラフィックを得るために、係数 2 でオーバーサンプリングして描画し、後で縮小します。

だから私がやっていることは、 wxMemoryDC の wxBitmap でオーバーサンプリングされたものを描画 DCにコピーする前に縮小することです。以下のコードは問題なく動作しますが、bitmapOversampled.ConvertToImage(); は非常に遅いです。

wxBitmap から wxImage に、またはその逆に変換せずに同じことを達成する方法はありますか?


    void OnPaint
    ( wxPaintEvent& event )
    {
        wxBitmap bitmapOversampled(m_width * 2, m_height * 2);
        wxMemoryDC memDC(bitmapOversampled);

        // Draw the elements.
        drawElements(&memDC);

        // Scale to correct size.
        wxImage image = bitmapOversampled.ConvertToImage();
        image.Rescale(m_width, m_height);
        memDC.SelectObject(wxBitmap(image));

        // Copy to dc.
        wxPaintDC dc(this);
        dc.Blit(0, 0, m_width, m_height, &memDC, 0, 0);
    };
4

1 に答える 1

2

残念ながら、そのスケーリングを高速化するための移植可能な wx メソッドはありません。しかし、wxBitmap の Gtk ポートには Scale メソッドがあります。それを wxGTK に使用できます。wxMSW では、win32 API の StretchBlt を使用できます。Windows 用のネイティブ HDC ハンドルを提供する wxDC のメソッドがあります。

直接描画すると、いくらか簡単になります。

wxPaintDC dc(this);
dc.DrawBitmap(image, 0, 0, false);

また、各ペイント イベントでビットマップを再作成しないでください。メンバーとして保存し、wxSizeEvent. これにより、おそらくプログラムが大幅に高速化されます。

もう 1 つの方法は、スケーリングを完全に削除してwxGraphicsContextを使用することです。wxGTK では Cairo を使用し、wxMSW では gdi+ を使用します。比較的新しいですが、アンチエイリアスで描画できます。

于 2008-11-23T23:46:45.743 に答える