#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