一个本地、确定性的图片与视频元数据清理工具:保留可见内容,移除嵌入文件中的描述性元数据。
图片和视频文件可能携带 EXIF、XMP、IPTC、评论、PNG 文本、容器标签、章节、字幕或其他描述性字段。这些字段可能包含提示词、标题、作者、软件名称、位置信息或其他不希望随文件传播的内容。
Dylan Image Cleaner 通过重新导出图片或重新编码视频,生成一个独立的干净副本,并输出验证结果。工具在本地运行,不调用模型,也不会上传媒体文件。
- 清理 JPG、PNG、WebP、TIFF 图片中的 EXIF、XMP、IPTC、评论和 PNG 文本等描述性元数据。
- 清理 MP4、M4V、MOV、MKV、WebM 视频中的容器/流标签、章节、字幕和数据流。
- 图片自动应用 EXIF 方向,避免清理后出现旋转方向错误。
- 视频保留第一个视频流和可用音频,并重新编码,避免简单复制编解码器层面的隐藏元数据。
- 支持普通文本输出和
--json机器可读验证报告。 - 默认写入新的输出路径,不覆盖源文件。
| 类型 | 输入与输出格式 | 说明 |
|---|---|---|
| 图片 | .jpg .jpeg .png .webp .tif .tiff |
输出格式由输出文件扩展名决定 |
| 视频 | .mp4 .m4v .mov .mkv .webm |
需要 FFmpeg 和 FFprobe |
git clone https://github.com/xDylanLong/dylan-image-cleaner.git
cd dylan-image-cleaner
python3 -m pip install -r requirements.txt视频清理还需要在 PATH 中安装 ffmpeg 和 ffprobe。图片清理只需要 Pillow 依赖。
仓库根目录本身就是一个可安装的 Skill。把 Skill 文件复制到 Codex 的 skills 目录:
skill_root="${CODEX_HOME:-$HOME/.codex}/skills/dylan-image-cleaner"
mkdir -p "$skill_root"
cp -R SKILL.md LICENSE requirements.txt agents scripts "$skill_root/"安装后可以在 Codex 中调用:
Use $dylan-image-cleaner 清理这张图片或这段视频,保留视觉内容并生成新的输出文件。
python3 scripts/clean_image.py input.jpg output.jpg
python3 scripts/clean_image.py input.png output.png --json
python3 scripts/clean_image.py input.webp output.webp --strip-icc脚本会读取输入图片,应用 EXIF 方向,然后不向输出编码器传入 EXIF、XMP、评论或 PNG 文本等描述性字段。输出文件必须与输入文件使用不同路径;如果输出已经存在,需要显式添加 --force。
JPEG 输出会把透明区域铺到白色背景。如果透明度重要,请优先输出为 PNG 或 WebP。动图不会被静默转换成单帧,而是直接拒绝处理。
python3 scripts/clean_video.py input.mp4 output.mp4
python3 scripts/clean_video.py input.mov output.mp4 --json
python3 scripts/clean_video.py input.webm output.webm --crf 24视频清理会:
- 保留第一个视频流和可用音频流。
- 移除容器与流元数据、章节、字幕和数据流。
- 重新编码视频,避免通过 stream copy 原样带出编解码器层面的隐藏字段。
- 检查输出是否仍包含视频,以及是否保留了预期的音频。
MP4、M4V、MOV、MKV 默认使用 H.264 + AAC;WebM 使用 VP9 + Opus。--crf 越低,H.264 输出质量通常越高、文件也越大。
添加 --json 可以输出机器可读的验证结果,适合脚本或批处理使用:
python3 scripts/clean_image.py input.jpg output.jpg --json
python3 scripts/clean_video.py input.mp4 output.mp4 --json报告会包含输入/输出路径、输出格式、尺寸或编解码器、发现和移除的元数据字段、剩余字段,以及 verified 验证结果。视频报告还会说明音频是否保留、字幕和数据流是否被丢弃。
如果目的是生成社交媒体上传副本,建议按下面的顺序操作:
- 使用独立输出路径生成清理后的副本,保留原始文件作为备份。
- 打开输出文件,检查画面、方向、尺寸、时长、音频和透明度是否符合预期。
- 确认法律要求的署名、AI 内容披露、同意标记和授权水印仍然存在;不要把元数据清理当成删除这些内容的方式。
- 上传清理后的副本时,预期平台可能再次压缩、转码、读取媒体内容,或根据画面、账号和上传行为添加 AI 标签。
- 如果平台、客户或内容流程要求保留 C2PA/JUMBF 等来源凭证,请先确认要求再清理,因为重新编码可能移除这类嵌入式来源容器。
本地报告只能证明当前输出文件通过了本地检查,不能证明它符合某个平台的全部上传规则,也不能保证平台不会标记或限制内容。
这个工具清理的是“嵌入在文件里的元数据”,不是对画面进行编辑:
- 如果提示词、署名、披露或水印已经被渲染进图片像素或视频帧,元数据清理无法移除它们。
- 清理后的文件不代表内容由人类创作,也不代表平台不会识别或标记 AI 内容。
- 社交平台上传后追加的 AI 标签、内容识别或账号级判断不受本地文件控制。
- 请保留法律要求的署名、披露、同意标记和你有义务保留的水印;只有在明确拥有授权时才处理相关内容。
- 清理图片和视频都会生成新的文件,默认不会覆盖源文件。
- PNG 是无损输出;JPEG 和 WebP 使用质量 95;JPEG 会处理透明度铺白。
- 视频重新编码可能改变文件大小、编解码器和逐帧字节,即使画面和时长基本保持一致。
--strip-icc会额外移除 ICC 色彩配置文件;默认保留它以尽量维持色彩一致性。- 清理报告显示“没有剩余描述性元数据”,不等于平台一定不会在上传后进行识别或添加标签。
.
├── README.md
├── README_EN.md
├── LICENSE
├── SKILL.md
├── agents/
│ └── openai.yaml
├── requirements.txt
└── scripts/
├── clean_image.py
└── clean_video.py