You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取PG文件中的多幅图片并统计数量?

解决PG格式多图提取问题

先明确PG文件的可能性质

PG并非通用图像格式,大概率是自定义/小众图像打包格式,或是其他多帧/多页格式(如TIFF、多帧GIF、PDF)被修改了后缀名。你可以先通过二进制编辑器查看文件头,判断实际格式:

  • TIFF文件头:小端为49 49 2A 00,大端为4D 4D 00 2A
  • PDF文件头:%PDF-
  • 多帧GIF文件头:47 49 46 38

多图提取的Python实现方案

方案1:用Pillow遍历所有帧

如果Pillow仅读取到第一帧,说明该PG文件本质是多帧/多页图像容器,可通过序列遍历方法提取所有图片:

from PIL import Image

with Image.open('1.pg') as img:
    # 统计图片数量
    total_frames = img.n_frames
    print(f"文件内共包含 {total_frames} 张图片")
    
    # 逐个提取并保存
    for frame_idx in range(total_frames):
        img.seek(frame_idx)
        rgb_frame = img.convert('RGB')
        rgb_frame.save(f'image_{frame_idx+1}.jpg')

该方案适用于Pillow支持的多帧格式,若PG是改后缀的这类文件,即可生效。

方案2:解析自定义二进制结构(若方案1无效)

如果上述方法失败,说明PG是自定义打包格式,可通过以下步骤处理:

  1. 对比在线转换器导出的图片与原PG文件的二进制内容,找到图片的分隔标识(如特定字节序列)
  2. 编写代码按分隔符拆分文件,提取单张图片的二进制数据后保存

示例(假设分隔符为JPEG文件头b'\xFF\xD8\xFF\xE0'):

with open('1.pg', 'rb') as f:
    raw_data = f.read()

# 定位所有JPEG文件头的位置
jpeg_start_positions = [i for i in range(len(raw_data)) if raw_data.startswith(b'\xFF\xD8\xFF\xE0', i)]

# 逐个提取并保存图片
for idx, start in enumerate(jpeg_start_positions):
    # 确定当前图片的结束位置
    end = jpeg_start_positions[idx+1] if idx+1 < len(jpeg_start_positions) else len(raw_data)
    single_img_data = raw_data[start:end]
    with open(f'extracted_img_{idx+1}.jpg', 'wb') as out_file:
        out_file.write(single_img_data)

额外提示

  • 若不确定文件格式,可通过file命令(Windows可借助Git Bash或WSL)查看实际类型:file 1.pg
  • 在线转换器能成功提取,说明格式具备可解析性,核心是找到其结构规律

内容的提问来源于stack exchange,提问作者Taha Omar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:25:16