wxWidgets: есть ли способ избежать или ускорить wxBitmap :: ConvertToImage ()?
Вопрос
Чтобы получить плавную графику, я хочу отрисовать передискретизацию с коэффициентом 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. Это относительно новый, но может рисовать сглаживание.