wxwidgets : wxbitmap :: convertToImage ()를 피하거나 속도를 높이는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/313108

  •  10-07-2019
  •  | 
  •  

문제

부드러운 그래픽을 얻으려면 Factor 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 방법은 없습니다. 그러나 wxbitmap의 GTK 포트에는 스케일 방법이 있습니다. WXGTK에 사용할 수 있습니다. WXMSW의 경우 Win32 API의 StretchBlt를 사용할 수 있습니다. WXDC에는 Windows 용 기본 HDC 핸들을 제공하는 방법이 있습니다.

직접 그리면 다소 더 간단하게 만들 수 있습니다.

wxPaintDC dc(this);
dc.DrawBitmap(image, 0, 0, false);

또한 각 페인트 이벤트에서 비트 맵을 재현하지 마십시오. 회원으로 저장하고 wxSizeEvent. 아마도 프로그램 속도가 상당히 높아질 것입니다.

또 다른 방법은 스케일링을 완전히 떨어 뜨리고 사용하는 것입니다. wxgraphicsContext. WXGTK에서 카이로, WXMSW에서는 GDI+를 사용합니다. 상대적으로 새롭지 만 항아리아를 그릴 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top