2

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

1 回答 1

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+。它相对较新,但可以绘制抗锯齿。

于 2008-11-23T23:46:45.743 回答