wxWidgets:有没有办法避免或加速wxBitmap :: ConvertToImage()?

时间:2008-11-23 23:24:39

标签: drawing wxwidgets scaling

为了得到一些平滑的图形,我想用因子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);
    };

1 个答案:

答案 0 :(得分:2)

可悲的是,没有可移植的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 +。它相对较新,但可以绘制抗锯齿。