3

私の GUI ツールキットである wxPython は、ユーザーのズーム倍率を実装する方法をいくつか提供していますが、品質はあまり良くありません。ズーム機能を作成する方法についてのアイデアを探していますが、これは複雑です。

描画されるキャンバスを表すビットマップがあります。これは、スクロールされたウィンドウ内に表示されます。

私が予見する問題: - キャンバスをズームインしてパンしたときのパフォーマンス - 「実際の」座標とズームイン座標の問題 - ズームしても画質が低下しない

デバイス コンテキストで wxPython の SetUserScale() を使用すると、次のような画質が得られます。これは、1 ピクセルの線を 30% 拡大したものです。

必要な一般的な手順と、直面する課題について考えています。提案をありがとう

4

2 に答える 2

2

使ってみましたGraphicsContextか?

ここにいくつかのサンプルコードがあります。GCDCラッパーを使用すると、既存のコードに簡単にドロップできるはずです。次の行だけが必要な場合があります。dc = wx.GCDC(dc)

レンダリングはかなり遅くなります!これを、ユーザーが有効/無効にできるオプションにすることができます。

代替テキスト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()
于 2010-08-07T13:56:32.450 に答える
2

OpenGL を使用してシーンをレンダリングできます。ハードウェアのスケーリングとパンニングが得られますが、これはおそらく非常に高速です。OpenGL にもさまざまな平滑化フィルターがあり、カスタム フィルターが必要な場合は GLSL を使用できます。

手動で処理したい場合は、双一次補間双三次補間を調べてください。

于 2010-04-18T21:54:28.917 に答える