Общий алгоритм масштабирования для программы рисования - PullRequest
3 голосов
/ 19 апреля 2010

Мой инструментарий с графическим интерфейсом, wxPython предоставляет несколько методов для реализации коэффициента масштабирования пользователя, однако качество не слишком хорошее. Я ищу идеи о том, как создать функцию масштабирования, которая, как я знаю, сложна.

У меня есть растровое изображение моего холста, к которому обращается. Это отображается внутри прокручиваемого окна.

Проблемы, которые я вижу: - производительность при увеличении и панорамировании на холсте - трудности с «реальными» координатами и масштабированием по координатам - качество изображения не ухудшается при увеличении

Использование wxPython SetUserScale () в контексте устройства обеспечивает качество изображения, подобное этому - это с линией 1px, увеличенной на 30%.

Мне просто интересно, какие общие шаги мне нужно предпринять, и с какими трудностями я столкнусь. Спасибо за любые предложения

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Вы можете визуализировать вашу сцену, используя OpenGL. Вы получаете аппаратное масштабирование и панорамирование, что, вероятно, будет очень быстрым. В OpenGL также доступны различные фильтры сглаживания, и вы можете использовать GLSL, если вам нужен специальный фильтр.

Если вы хотите что-то сделать вручную, посмотрите на билинейную интерполяцию и бикубическую интерполяцию .

1 голос
/ 07 августа 2010

Вы пробовали использовать 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()
...