2010-04-18 5 views
3

내 GUI 툴킷 인 wxPython은 사용자 줌 팩터를 구현하는 몇 가지 방법을 제공하지만 품질은 그다지 좋지 않습니다. 제가 알고있는 줌 기능을 만드는 방법에 대한 아이디어를 찾고 있습니다.그리기 프로그램의 일반적인 줌 알고리즘

저는 그에게 그려지는 나의 캔버스를 나타내는 비트 맵을 가지고 있습니다. 스크롤 된 창 안에 표시됩니다.

문제는 난을 forsee : - 성능을 확대 캔버스 주위 패닝 할 때 -에 wxPython을의 SetUserScale()를 사용하여 이미지 품질 줌

으로 저하되지 - "진짜"좌표 어려움을하고 좌표 확대 해당 장치 컨텍스트는 image quality like this입니다.이 값은 30 % 확대 된 1px 라인입니다.

나는 걸어야 할 일반적인 단계와 내가 겪게 될 도전에 대해 궁금합니다. 어떤 제안을 주셔서 감사합니다

+0

당신은 벡터화 된 그래픽을 렌더링하고 있습니까 (선, 원 등) 또는 비트 맵? – strager

+0

둘 다 - 그래픽이 실제로 "벡터"가 아니지만 –

답변

2

OpenGL을 사용하여 장면을 렌더링 할 수 있습니다. 아마도 하드웨어 스케일링과 패닝을 할 수 있습니다. 이것은 매우 빠릅니다. OpenGL에서 사용할 수있는 다양한 스무딩 필터가 있습니다. 사용자 정의 필터가 필요한 경우 GLSL을 사용할 수 있습니다.

수동으로 수행하려는 경우 bilinear interpolationbicubic interpolation을 확인하십시오.

1

GraphicsContext을 사용해 보셨습니까?

다음은 몇 가지 샘플 코드입니다. 래퍼 GCDC을 사용하여 기존 코드에 쉽게 놓을 수 있어야합니다. 다음 줄만 필요할 수도 있습니다. dc = wx.GCDC(dc)

렌더링 속도가 훨씬 느립니다! 이 옵션을 사용자가 활성화/비활성화 할 수 있도록 설정할 수 있습니다.

alt text http://www.michaelfogleman.com/static/images/gcdc.png

import wx 
import random 

class Panel(wx.Panel): 
    def __init__(self, parent): 
     super(Panel, self).__init__(parent, -1) 
     self.Bind(wx.EVT_PAINT, self.on_paint) 
     self.lines = [[random.randint(0, 500) for i in range(4)] for j in range(100)] 
    def on_paint(self, event): 
     dc = wx.PaintDC(self) 
     dc = wx.GCDC(dc) 
     dc.SetUserScale(0.3, 0.3) 
     for line in self.lines: 
      dc.DrawLine(*line) 

class Frame(wx.Frame): 
    def __init__(self): 
     super(Frame, self).__init__(None, -1, 'Test') 
     Panel(self) 

if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 
+0

예, 성능이 저하되어 대체 솔루션을 찾으려합니다. 불행히도 물건을 확대하는 방법을 공식화하는 수학 능력이 부족하여 다른 선택의 여지가 거의 없습니다. –

관련 문제