为了得到一些平滑的图形,我想用因子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);
};
答案 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 +。它相对较新,但可以绘制抗锯齿。