# /// script
# requires-python = ">=3.13"
# dependencies = [
# "opencv-python",
# "pillow",
# "pyzbar",
# ]
# ///
import cv2
from pyzbar.pyzbar import decode
from PIL import Image, ImageSequence
import shutil
import os
def process_animated_gif(gif_path, output_dir="gif_frames"):
"""
分解GIF动图并识别各帧二维码内容
参数:
gif_path: 输入GIF文件路径
output_dir: 存储单帧图片的目录(默认: "gif_frames")
"""
try:
# 1. 创建输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 2. 分解GIF为单帧图片
print(f"开始分解GIF: {gif_path}")
with Image.open(gif_path) as gif_image:
frame_count = 0
for frame in ImageSequence.Iterator(gif_image):
# 保存单帧为PNG格式
frame_path = os.path.join(output_dir, f"frame_{frame_count:04d}.png")
frame.save(frame_path, "PNG")
frame_count += 1
print(f"分解完成,共提取 {frame_count} 帧图片")
# 3. 批量识别二维码
print("\n开始识别二维码内容:")
qr_text = ""
qr_results = []
for filename in sorted(os.listdir(output_dir)):
if filename.endswith(".png"):
img_path = os.path.join(output_dir, filename)
# 读取图片并转换为灰度图(提高识别率)
img = cv2.imread(img_path)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 识别二维码
barcodes = decode(gray_img)
for barcode in barcodes:
data = barcode.data.decode("utf-8", errors="ignore")
qr_results.append((filename, data))
print(f"文件 {filename}: {data}")
qr_text += data
# 4. 清理
shutil.rmtree(output_dir)
print(f"识别结果: ${qr_text}")
except Exception as e:
print(f"处理失败: {str(e)}")
if __name__ == "__main__":
# 配置参数(请修改为实际文件路径)
INPUT_GIF_PATH = "masterGO.gif" # 待处理的GIF文件路径
# 执行处理
process_animated_gif(INPUT_GIF_PATH)