wxWidgets:wxBitmap :: ConvertToImage()を回避または高速化する方法はありますか?

StackOverflow https://stackoverflow.com/questions/313108

  •  10-07-2019
  •  | 
  •  

質問

スムーズなグラフィックスを得るには、係数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);
    };
役に立ちましたか?

解決

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

直接描画する場合は、いくぶん簡単にすることができます:

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

また、各ペイントイベントでビットマップを再作成しないでください。メンバーとして保存し、 wxSizeEvent を取得した場合にのみ再作成します。それはおそらくあなたのプログラムをかなり高速化するでしょう。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top