wxWidgets: есть ли способ избежать или ускорить wxBitmap :: ConvertToImage ()?

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

  •  10-07-2019
  •  | 
  •  

Вопрос

Чтобы получить плавную графику, я хочу отрисовать передискретизацию с коэффициентом 2 и затем уменьшить масштаб.

Так что я делаю, чтобы рисовать передискретизацию на wxBitmap в wxMemoryDC , а затем уменьшать ее перед копированием в мой 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, который бы делал это масштабирование быстрее. Но есть метод Scale в порту Gtk в wxBitmap. Вы можете использовать это для wxGTK. Для wxMSW вы можете использовать StretchBlt из win32 API. В wxDC есть методы, которые предоставят вам собственный дескриптор HDC для Windows.

Вы можете сделать это несколько проще, если будете рисовать напрямую:

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

Кроме того, не создавайте заново растровое изображение в каждом событии рисования. Сохраните его как член и создавайте его заново только тогда, когда вы получите wxSizeEvent . Это, вероятно, значительно ускорит вашу программу.

Другой способ - полностью отказаться от масштабирования и использовать wxGraphicsContext . Он использует Cairo на wxGTK и gdi + на wxMSW. Это относительно новый, но может рисовать сглаживание.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top