В настоящее время я пишу программу, которая должна позволить пользователю рисовать простые линии, а также рисовать прямоугольники для выбора области. Раньше я использовал холст tkinter, но у него была производительность с некоторыми операциями, а также утечка памяти, поэтому вместо этого я пытаюсь использовать подушку для рисования.
Вот мой код для рисования прямоугольника:
def drawRect(self, start, end):
x1 = end[0]
y1 = end[1]
x0 = start[0]
y0 = start[1]
t0 = time()
t = time()
#size of image is roughly between 1000x1000 to 1080p
rectLayer = Image.new("RGBA", self.backgroundImage.size)
rectDraw = ImageDraw.Draw(rectLayer)
rectDraw.rectangle([start, end], fill="#00000080")
rectDraw.line((x0, y0, x1, y0, x1, y1, x0, y1, x0, y0), fill="#ffffff", width=1)
print("drawing: ", time() - t)
t = time()
displayImage = Image.alpha_composite(self.backgroundImage, self.linesLayer)
displayImage.alpha_composite(rectLayer, (0, 0), (0, 0))
print("image blend: ", time() - t)
t = time()
self.photoImage = ImageTk.PhotoImage(displayImage)
print("photoImage convert: ", time() - t)
t = time()
self.imageContainer.configure(image=self.photoImage) # imageContainer is a Label
print("label config: ", time() - t)
print("total: ", time() - t0)
'''
Output for drawing a single rect:
drawing: 0.001994609832763672
image blend: 0.009583711624145508
photoImage convert: 0.0139617919921875
label config: 0.02194380760192871
total: 0.049475669860839844
'''
Проблема, с которой я столкнулся, заключается в том, что, хотя PIL работает быстро, отображение этого изображения - нет. Со времени моего профилирования рисование прямоугольника занимало очень мало времени, а вот преобразование изображения в фотоизображение, затем установка его как изображения этикетки заняло много времени. Я надеялся, что эти функции могут выполняться не менее 60 раз или около того в секунду, чтобы программа работала более плавно. Есть ли способ, которым я могу отображать изображения быстрее?
tkinter
и выкинуть в ближайшую мусорку. Tkinter ВСЕГДА был хаком. Вы можете не знать, что tkinter — это библиотека, написанная на языке под названием tcl. Python должен запускать свой собственный интерпретатор tcl внутри интерпретатора Python. Все, что вы делаете в tkinter, заканчивается запуском команды в интерпретаторе tcl. Выбросьте это и используйте настоящую библиотеку пользовательского интерфейса, такую как wxPython или Qt. Если все, что вам нужно, это изображения, даже OpenCV может это сделать. - person Tim Roberts   schedule 10.05.2021self.photoImage.paste(displayImage)
для заменыself.photoImage = ImageTk.PhotoImage(...)
иself.imageContainer.configure(...)
. - person acw1668   schedule 10.05.2021C
, но в Python есть прямой эквивалент, если концепция работает stackoverflow.com/a/42297587/2836621 - person Mark Setchell   schedule 14.05.2021