6.14
今天完成了python的大作业,变形动画,将两个图片合成一张动图:
import os
import glob
from tkinter.filedialog import asksaveasfilename
from tkinter import messagebox
from tkinter import Tk, messagebox
from tkinter.filedialog import askopenfilename
from PIL import Image
# 鍒涘缓涓?涓獥鍙e苟浣垮叾闅愯棌
window = Tk()
window.withdraw()
def get_valid_image_path(prompt):
"""Prompt user for a valid image file and return its path."""
while True:
filename = askopenfilename(title=prompt)
try:
# Try to open the image to check if it's valid
with Image.open(filename) as image: # 浣跨敤with璇彞鑷姩鍏抽棴鏂囦欢
return filename
except (FileNotFoundError, Image.UnidentifiedImageError):
messagebox.showerror("閿欒", "璇烽?夋嫨鏈夋晥鐨勫浘鐗囨枃浠?")
continue # 閲嶆柊寮?濮嬪惊鐜鐢ㄦ埛閫夋嫨
# 閫夋嫨棣栧熬鍥剧墖
print("璇烽?夋嫨绗竴寮犲浘鐗囷細")
filename1 = get_valid_image_path("璇烽?夋嫨绗竴寮犲浘鐗囷細")
print("璇烽?夋嫨绗簩寮犲浘鐗囷細")
filename2 = get_valid_image_path("璇烽?夋嫨绗簩寮犲浘鐗囷細")
image1 = Image.open(filename1)
image2 = Image.open(filename2)
# 鑾峰彇鍥剧墖澶у皬鍜屾ā寮?
width1, height1 = image1.size
width2, height2 = image2.size
mode = image1.mode
# 濡傛灉涓ゅ紶鍥剧墖澶у皬涓嶄竴鑷达紝鍒欏皢瀹冧滑缁熶竴璋冩暣涓哄ぇ灏忕浉鍚?
if width1 != width2 or height1 != height2:
new_width = max(width1, width2)
new_height = max(height1, height2)
image1 = image1.resize((new_width, new_height))
image2 = image2.resize((new_width, new_height))
# 鍒涘缓涓?涓狦IF鏂囦欢瀵硅薄
gif_filename = "output.gif"
frames = []
duration = 0.1
loop = 0
# 鍚堟垚GIF鍔ㄧ敾
for i in range(12):
# 鏍规嵁鍙樺舰绋嬪害鑾峰彇涓棿鍥剧墖
progress = i / 10.0
image3 = Image.blend(image1, image2, progress)
# 淇濆瓨涓棿鍥剧墖
temp_filename = os.path.join(".", "temp{}.png".format(i))
image3.save(temp_filename, "PNG")
# 娣诲姞鍒板抚搴忓垪涓?
frames.append(Image.open(temp_filename))
# 鑾峰彇鐢ㄦ埛閫夋嫨鐨勪繚瀛樿矾寰勫拰鏂囦欢鍚?
print("璇烽?夋嫨淇濆瓨浣嶇疆鍜屾枃浠跺悕锛?")
save_filename = asksaveasfilename(defaultextension=".gif", filetypes=[("GIF files", "*.gif")])
# 淇濆瓨GIF鏂囦欢
frames[0].save(save_filename, format="GIF", append_images=frames[1:], save_all=True, duration=duration, loop=0)
# 鍒犻櫎涓存椂鏂囦欢
temp_files = glob.glob("temp*.png")
for temp_file in temp_files:
os.remove(temp_file)
print("GIF鏂囦欢宸蹭繚瀛橈細", save_filename)

浙公网安备 33010602011771号