Domanda

Per ottenere una grafica fluida, desidero disegnare sovracampionato per il fattore 2 e ridimensionarlo in seguito.

Quindi quello che sto facendo è disegnare sovracampionato su un wxBitmap in un wxMemoryDC , e poi ridimensionarlo prima di copiarlo sul mio dc. Il codice seguente funziona bene, ma bitmapOversampled.ConvertToImage (); è estremamente lento.

Esiste un modo per ottenere lo stesso senza dover convertire da wxBitmap a wxImage e viceversa?


    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);
    };
È stato utile?

Soluzione

Purtroppo, non esiste un metodo wx portatile per eseguire questo ridimensionamento più velocemente. Ma c'è un metodo di ridimensionamento nella porta Gtk in wxBitmap. Puoi usarlo per wxGTK. Per wxMSW, è possibile utilizzare StretchBlt dell'API win32. Esistono metodi in wxDC che ti forniranno l'handle HDC nativo per Windows.

Puoi renderlo un po 'più semplice se disegni direttamente:

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

Inoltre, non ricreare la bitmap in ogni evento di disegno. Memorizzalo come membro e ricrealo solo quando ottieni un wxSizeEvent . Probabilmente accelererà considerevolmente il tuo programma.

Un altro modo è eliminare completamente il ridimensionamento e utilizzare wxGraphicsContext . Utilizza Cairo su wxGTK e gdi + su wxMSW. È relativamente nuovo, ma può disegnare in antialias.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top