ctf-gif 解帧识别

Run Settings
LanguagePython
Language Version
Run Command
# /// 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)
Editor Settings
Theme
Key bindings
Full width
Lines