绘图程序的通用缩放算法

时间:2010-04-18 21:49:04

标签: wxpython zoom draw

我的GUI工具包,wxPython提供了一些实现用户缩放因子的方法,但质量不太好。我正在寻找有关如何创建缩放功能的想法,我知道这很复杂。

我有一个代表我的画布的位图。这显示在滚动窗口内。

我怀疑的问题:   - 放大并在画布周围平移时的性能   - “真实”坐标和放大坐标的困难   - 图像质量不会因缩放而降低

在其设备上下文中使用wxPython的SetUserScale()会显示image quality like this - 这是1px行,放大30%。

我只是想知道我需要采取的一般步骤以及我将遇到的挑战。感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

您可以使用OpenGL渲染场景。您可以获得硬件扩展和平移,这可能会非常快。 OpenGL中也有各种平滑过滤器,如果你想要一个自定义过滤器,你可以使用GLSL。

如果您想手动执行操作,请查看bilinear interpolationbicubic interpolation

答案 1 :(得分: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()