Эффективная анимация перехода изображений с перекрестным (смешиванием) с помощью tkinter

#image #tkinter #animation #transition #blend

Вопрос:

Я работаю над проектом слайд-шоу на python с использованием tkinter. Графический интерфейс позволяет пользователю выбирать изображения (в конечном итоге также видео) из галереи миниатюр и отображать выбранное изображение на внешнем мониторе или проекторе, одновременно отображая изображение предварительного просмотра в графическом интерфейсе (два разных интерфейса). Цель состоит в том, чтобы создать плавную анимацию перехода между изображениями по мере их выбора. Я попытался создать циклическую функцию, которая постепенно изменяет значение .putalpha вновь выбранного изображения и применяет это изображение к верхнему «слою» холста. Это прекрасно работает при более низких разрешениях, но когда мое разрешение выше (около 1920х1080), производительность слишком высока, чтобы сделать переход плавным и презентабельным. После выполнения time.process_time_ns для отдельных функций и строк я подозреваю, что замедление происходит в момент нанесения изображения на холст. Я также успешно создал анимацию затухания с использованием спрайтов pyglet, но я не уверен, есть ли способ встроить вывод pyglet в мой текущий проект tkinter. Другой моей мыслью было бы каким-то образом использовать OpenCV для создания перехода. Каков был бы лучший способ создать эту анимацию? Заранее благодарю вас за вашу помощь! Ниже приведен мой код для использования цикла для применения изображений к холсту предварительного просмотра и вывода:

 def transition_loop():  global image_frame_count  global image_frames_needed  global fps  global start    if image_frame_count lt; image_frames_needed:  add_image_opacity()  # add selected image to background_image  window.after(int((1/fps)*1000), transition_loop) # time int is fps converted to ms  image_frame_count  = 1   def add_image_opacity():  global image_alpha_value  global live_image_original  global image_alpha_value_steps  global output_image_1_add, output_image_2_add, preview_image_1_add, preview_image_2_add, preview_image   image_alpha_value = (image_alpha_value   image_alpha_value_steps) # add step for each frame    live_image_original_output.putalpha(int(image_alpha_value))  live_image_original_preview.putalpha(int(image_alpha_value))    # four new global variables (one for each image canvas) are necessary to prevent garbage collection during transitions  if selected_image_canvas == image_preview_container_1:  # add selected image to output canvas  output_image_1_add = ImageTk.PhotoImage(live_image_original_output)  output_canvas.itemconfig(image_output_container_1, image=output_image_1_add)  output_canvas.coords(image_output_container_1, output_image_position_x, output_image_position_y)  output_image_1_add.image = output_image_1_add   # add selected image to preview canvas  preview_image_1_add = ImageTk.PhotoImage(live_image_original_preview)  preview_canvas.itemconfig(image_preview_container_1, image=preview_image_1_add)  preview_canvas.coords(image_preview_container_1, imagex2,imagey2) # moves image to imagex/imagey position  preview_image_1_add.image = preview_image_1_add    elif selected_image_canvas == image_preview_container_2:  # add selected image to output canvas  output_image_2_add = ImageTk.PhotoImage(live_image_original_output)   output_canvas.itemconfig(image_output_container_2, image=output_image_2_add)  output_canvas.coords(image_output_container_2, output_image_position_x, output_image_position_y)  output_image_2_add.image = output_image_2_add   # add selected image to preview canvas  preview_image_2_add = ImageTk.PhotoImage(live_image_original_preview)  preview_canvas.itemconfig(image_preview_container_2, image=preview_image_2_add)  preview_canvas.coords(image_preview_container_2, imagex2,imagey2) # moves image to imagex/imagey position  preview_image_2_add.image = preview_image_2_add