Показывать длинный перекрестный курсор над изображением плохо - PullRequest
1 голос
/ 17 марта 2020

Когда я загружаю изображение 3840x2160 с кодом ниже:

#!/usr/bin/env python3
import matplotlib.pyplot as plt
import matplotlib.image as image
import matplotlib.patches as patches

class SnaptoCursor(object):
    def __init__(self, ax):
        self.ax = ax
        self.lx = ax.axhline(color='r')  # the horiz line
        self.ly = ax.axvline(color='r')  # the vert line
        self.x = 0
        self.y = 0

    def mouse_move(self, event):
        if not event.inaxes:
            return
        x, y = event.xdata, event.ydata
        # update the line positions
        self.lx.set_ydata(y)
        self.ly.set_xdata(x)
        self.ax.figure.canvas.draw()

img = image.imread("exam.jpg") #3840x2160
fig,ax =plt.subplots(1)
ax.imshow(img)

snap_cursor = SnaptoCursor(ax)
fig.canvas.mpl_connect('motion_notify_event', snap_cursor.mouse_move)

plt.show()

Когда я двигаю мышь, я вижу, что длинный перекрестный курсор (две линии на самом деле) движется очень медленно. sh он сразу же перемещается курсором.

Добро пожаловать, если есть какое-либо иное хорошее решение!

1 Ответ

1 голос
/ 18 марта 2020

Вы перерисовываете весь холст каждый раз, когда движется мышь, в этом нет необходимости - вам просто нужно перерисовать двух художников и использовать блиттинг, чтобы избежать перерисовки остальных. Это немного сложно, когда за соответствующими художниками есть что-то (например, изображение или цвет sh). Что-то вроде этого должно быть достаточно:

class SnaptoCursor(object):
    def __init__(self, ax):
        # Have to draw the canvas once beforehand to cache the renderer
        ax.figure.canvas.draw()
        self.bg = ax.figure.canvas.copy_from_bbox(ax.bbox)
        self.ax = ax
        self.lx = ax.axhline(color='r')  # the horiz line
        self.ly = ax.axvline(color='r')  # the vert line
        self.x = 0
        self.y = 0

    def mouse_move(self, event):
        if not event.inaxes:
            return
        x, y = event.xdata, event.ydata
        # update the line positions
        ax.figure.canvas.restore_region(self.bg)
        self.lx.set_ydata(y)
        self.ly.set_xdata(x)
        self.ax.draw_artist(self.lx)
        self.ax.draw_artist(self.ly)
        self.ax.figure.canvas.blit(self.ax.bbox)

Хотя могут потребоваться корректировки в зависимости от серверной части et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...