wxWidgets: есть ли способ избежать или ускорить wxBitmap :: ConvertToImage ()? - PullRequest
2 голосов
/ 24 ноября 2008

Чтобы получить плавную графику, я хочу нарисовать передискретизацию с коэффициентом 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);
    };

1 Ответ

2 голосов
/ 24 ноября 2008

К сожалению, нет портативного метода 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. Это относительно новый, но может рисовать сглаживание.

...