如何放大TkinterVideo播放的视频?显示尺寸小于原图像
问题:TkinterVideo播放自制MP4时无法按指定尺寸显示
我用MoviePy将400x400的词云图片生成了MP4视频,但用TkinterVideo组件播放时,视频显示尺寸远小于原图大小。调整TkinterVideo的width和height参数完全没用,单个词云用Tkinter Label显示是正常的。相关代码如下:
# Create a video from the wordcloud images if chosen_mwordclouds.get() and num_wordclouds > 1: # Check if a wordcloud label already exists if hasattr(hashtag_frame, 'wordcloud_label'): # Destroy the previous label widget hashtag_frame.wordcloud_label.destroy() video_path = 'wordcloud_video.mp4' # Set the video file path # Create a list of image paths for the wordclouds image_paths = ['wordcloud_' + str(x + 1) + '.png' for x in range(num_wordclouds)] # Create a list of images from the image paths (multiplied by 36 to make the video longer) images = 36*[cv2.imread(image_path) for image_path in image_paths] print(len(images)) # Create a video clip from the list of images clip = ImageSequenceClip(images, fps=1) # Save the video clip as a video file clip.write_videofile(video_path) # Check if a video label already exists if hasattr(hashtag_frame, 'video_player'): # Destroy the previous label widget hashtag_frame.video_player.destroy() video_player = TkinterVideo(hashtag_frame, width=400, height=400) video_player.load("wordcloud_video.mp4") video_player.pack() video_player.play() def loopVideo(event): video_player.play() video_player.bind('<<Ended>>', loopVideo) else: messagebox.showerror('Error', 'Please enter a hashtag')
解决方法
1. 生成视频时强制指定分辨率
MoviePy的ImageSequenceClip可能因图像读取格式问题,导致生成的视频实际分辨率并非400x400。创建片段时明确指定尺寸:
# 创建视频片段时强制设置目标分辨率 clip = ImageSequenceClip(images, fps=1, size=(400, 400)) # 写入视频时补充编码参数,确保分辨率正确 clip.write_videofile(video_path, codec='libx264', preset='medium')
2. 修正OpenCV图像格式
OpenCV读取的图像是BGR格式,与MoviePy默认的RGB格式不兼容,可能导致尺寸识别异常。转换格式后再传入:
# 将BGR转成RGB格式后生成图像列表 images = 36*[cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB) for image_path in image_paths]
3. 调整TkinterVideo的布局与缩放
TkinterVideo默认可能保持视频原比例且不拉伸,尝试修改布局方式并添加缩放参数:
video_player = TkinterVideo(hashtag_frame, width=400, height=400, scale=1.0) video_player.load("wordcloud_video.mp4") # 让组件填充父容器并允许拉伸 video_player.pack(fill=tk.BOTH, expand=True) video_player.play()
4. 手动逐帧播放(备选方案)
如果TkinterVideo的缩放机制存在固有问题,改用PIL+Label手动控制每一帧的尺寸:
from PIL import Image, ImageTk import cv2 import tkinter as tk def play_custom_video(video_path, parent, width=400, height=400): cap = cv2.VideoCapture(video_path) video_label = tk.Label(parent) video_label.pack() def update_frame(): ret, frame = cap.read() if ret: # 转换格式并调整尺寸 frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = Image.fromarray(frame_rgb).resize((width, height), Image.Resampling.LANCZOS) imgtk = ImageTk.PhotoImage(image=img) video_label.imgtk = imgtk video_label.config(image=imgtk) # 按帧率定时更新 video_label.after(int(1000/cap.get(cv2.CAP_PROP_FPS)), update_frame) else: # 循环播放 cap.set(cv2.CAP_PROP_POS_FRAMES, 0) update_frame() update_frame() return video_label # 使用方式 if hasattr(hashtag_frame, 'video_player'): hashtag_frame.video_player.destroy() hashtag_frame.video_player = play_custom_video("wordcloud_video.mp4", hashtag_frame, 400, 400)
内容的提问来源于stack exchange,提问作者Jovisc
相关产品推荐
相关产品推荐

