Quick actions

cmd+k|ctrl+k

Navigation

Languages

ctf-gif 解帧识别

Snippet info

Language

Python

Visibility

public

Author

742899387

Created

2025-06-06T05:31:32.581018Z

Updated

2025-06-06T05:31:53.103839Z

# /// 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)
INFO