如何用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是自定义打包格式,可通过以下步骤处理:
- 对比在线转换器导出的图片与原PG文件的二进制内容,找到图片的分隔标识(如特定字节序列)
- 编写代码按分隔符拆分文件,提取单张图片的二进制数据后保存
示例(假设分隔符为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
相关产品推荐
相关产品推荐

