# Image Forensics

> 图片取证分析 skill。当用户提供图片文件路径，或说"帮我检测这张图"、"分析图片"、"查 EXIF"、"看看是不是 AI 生成的"、"品牌风险"、"图片尺寸是否符合要求"时触发。执行六维度取证分析并返回结构化中文报告。

- Skill: `aiwayne/image-forensics` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add aiwayne/image-forensics`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aiwayne/image-forensics/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: aiwayne (https://skillmd.com/u/aiwayne)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aiwayne/image-forensics

---


# 图片取证分析

用户提供图片文件路径后，按以下六个维度分析，最终输出一份结构化中文报告。

---

## 执行流程

### Step 1 — 基础格式取证

```bash
# 真实格式（魔数检测）
file "<path>"

# 文件头 hex（前 16 字节）
xxd "<path>" | head -2

# SHA-256 指纹
python3 -c "import hashlib; print(hashlib.sha256(open('<path>','rb').read()).hexdigest())"

# 文件大小
python3 -c "import os; b=os.path.getsize('<path>'); print(f'{b} bytes ({b/1024:.1f} kB)')"
```

### Step 2 — 元数据提取

```bash
# 全量 EXIF/IPTC/XMP/GPS（首选）
exiftool -j "<path>"

# macOS 原生属性（降级兜底）
sips -g all "<path>"
```

> 若 exiftool 未安装：`brew install exiftool`

### Step 3 — 图像属性（Python）

```python
from PIL import Image
img = Image.open("<path>")
print(img.size, img.mode, img.format)
info = img.info
```

若 Pillow 未安装：`pip install Pillow`

### Step 4 — AI 生成检测（元数据 + 视觉双层打分）

参考标准：[AI-DETECTION-GUIDE.md](AI-DETECTION-GUIDE.md)

**第一层：元数据启发式（先跑，不需要看图）**

逐项检查并累计分值：

| 信号 | 分值 | 检查方法 |
|---|---|---|
| CreatorTool 含 AI 工具名 | **5 分** | Midjourney / SD / DALL-E / Firefly / ComfyUI / NovelAI |
| XMP 含 `ai:model` / `generativeAI` 字段 | **5 分** | exiftool 输出 |
| UUID 文件名 + AI 常见分辨率同时命中 | **3 分** | 文件名格式 + sips/PIL 尺寸 |
| 完全无 EXIF | **2 分** | Step 2 输出为空 |
| 分辨率为 64 整数倍（512/768/1024 等）| **1 分** | 尺寸分析 |
| 创建时间与修改时间完全相同 | **1 分** | exiftool 字段对比 |

**第二层：视觉分析（读取图片，逐项打分）**

读取图片内容，按 [AI-DETECTION-GUIDE.md](AI-DETECTION-GUIDE.md) 分值标准逐项检查：

| 类别 | 单类上限 |
|---|---|
| 手部/手指解剖异常 | 5 分 |
| 文字/数字乱码或无法阅读 | 5 分 |
| 面部皮肤过平 + 光线过于完美 | 3 分 |
| 背景结构错误（重复纹理/违反力学）| 3 分 |
| 边缘融化（主体与背景融合）| 2 分 |
| 光影方向矛盾 | 3 分 |
| 布料条纹在折皱处不连续 | 2 分 |
| 生成器视觉签名（暗角/渗透/插画风等）| 2 分 |

**综合得分判定：**
- **0–2 分** → 🟢 低可能性
- **3–5 分** → 🟡 疑似 AI 生成
- **≥6 分** → 🔴 高可能性 AI 生成

> 高置信度自动升级：手部异常+文字乱码同时命中，或 CreatorTool 直接包含 AI 工具名，无论总分直接判为 🔴

### Step 5 — 平台适配核验

对比以下规格，判断是否通过：

| 平台场景 | 最低要求 |
|---|---|
| 千图 Banner | 700×332px，≤150kB |
| mini 推荐横图 | 320×240px，≤40kB |
| mini 推荐方图 | 720×720px，≤200kB |
| 小红书封面 | 1080×1440px |
| 抖音封面 | 1080×1920px |
| 微博横图 | 1920×1080px |
| 屏幕显示 | 宽 ≥1080px |
| 印刷输出 | DPI ≥300 |

### Step 6 — 品牌 / IP 版权风险扫描（元数据 + 视觉双层）

**第一层：元数据关键词扫描**

在文件名 + 所有文本元数据中搜索品牌/IP 关键词（大小写不敏感）。

**第二层：视觉识别（读取图片内容，参考识别库）**

读取图片文件，对照 [BRAND-IP-LIBRARY.md](BRAND-IP-LIBRARY.md) 中的视觉特征描述，识别画面中出现的：
- 卡通角色（迪士尼/漫威/三丽鸥/泡泡玛特/日本动漫/中国 IP 等）→ 完整角色命中 **5 分**
- 品牌核心 Logo / 标识（Nike Swoosh、Apple 苹果、LV 字母等）→ **4 分**
- 品牌经典图案（Burberry 格纹、Chanel 菱格纹等）→ **3 分**
- 品牌特征元素局部出现（橙色盒子但无文字）→ **2 分**
- 风格相近但来源不确定 → **1 分**

对每个命中项记录：IP 名称 · 版权方 · 分值 · 画面位置。多项命中取各项之和。

**综合得分判定：**
- **0 分** → 🟢 无明显风险
- **1–3 分** → 🟡 中风险（建议人工复核）
- **≥4 分** → 🔴 高风险（商业使用前必须获得授权）

---

## 输出格式

> **核心原则：结论前置，证据后置。** 先给判定和理由，再展示详细检测数据。

输出一份 Markdown 取证报告，结构如下：

```markdown
# 图片取证报告 · {文件名}
> 分析时间：{时间} | 文件大小：{大小} | 分辨率：{W}×{H}px

---

## ⚡ 综合判定（先看这里）

| 维度 | 判定 | 得分 | 核心理由（1句话） |
|---|---|---|---|
| AI 生成可能性 | 🔴 高 / 🟡 疑似 / 🟢 低 | X 分 | {最关键的1条证据} |
| 品牌/IP 版权风险 | 🔴 高 / 🟡 中 / 🟢 无 | X 分 | {最关键的1条命中，或"未发现受保护元素"} |
| 格式安全 | ✅ 正常 / ⚠️ 异常 | — | {一致 / "扩展名伪装"} |

**最终建议：** 可安全使用 / 建议人工复核后使用 / 商业使用前必须获授权

> {2–3句综合说明：是什么图、主要风险点、最重要的行动建议}

---

## 详细检测报告

### 一、AI 生成检测

**判定：🔴/🟡/🟢 {结论} · 总分 X 分**

> 理由：{具体说明哪些信号驱动了判定，语言简洁直接}

**元数据层命中：**

| 信号 | 分值 |
|---|---|
| {信号描述} | +X 分 |
| **小计** | **X 分** |

**视觉层命中：**

| 信号 | 分值 |
|---|---|
| {视觉特征描述} | +X 分 |
| **小计** | **X 分** |

---

### 二、品牌 / IP 版权风险

**判定：🔴/🟡/🟢 {结论} · 总分 X 分**

> 理由：{说明命中了什么，或为什么判定无风险}

| 命中元素 | 版权方 | 画面位置 | 分值 |
|---|---|---|---|
| {IP/品牌名} | {公司} | {位置描述} | +X 分 |
| **合计** | | | **X 分** |

---

### 三、格式取证

| 字段 | 值 |
|---|---|
| **真实格式** | JPEG / PNG / WebP / HEIC / ... |
| **扩展名** | .xxx |
| **一致性** | ✅ 一致 / ⚠️ 不一致（伪装风险）|
| **编码方式** | Baseline DCT / Progressive / 无损 / ... |
| **文件大小** | X kB |
| **SHA-256** | `{hash}` |

---

### 四、显示质量

| 字段 | 值 |
|---|---|
| **分辨率** | {W}×{H} px（{MP} MP）|
| **宽高比** | {ratio} |
| **色彩模式** | RGB / CMYK / 灰度 |
| **位深** | 8-bit / 16-bit |
| **DPI** | {dpi}（或：无物理单位）|
| **色域** | sRGB / Adobe RGB / Display P3 / ... |

---

### 五、来源追溯

| 字段 | 值 |
|---|---|
| **相机/设备** | {make} {model}（或：无设备信息）|
| **处理软件** | {software} |
| **拍摄时间** | {datetime}（或：无时间戳）|
| **GPS 位置** | {lat, lon} → {地名}（或：无 GPS）|
| **元数据完整性** | EXIF ✅/❌ · IPTC ✅/❌ · XMP ✅/❌ |

---

### 六、平台适配

| 平台 | 规格要求 | 结果 |
|---|---|---|
| 千图 Banner | 700×332px ≤150kB | ✅/❌ |
| mini 推荐横图 | 320×240px ≤40kB | ✅/❌ |
| mini 推荐方图 | 720×720px ≤200kB | ✅/❌ |
| 小红书封面 | 1080×1440px | ✅/❌ |
| 抖音封面 | 1080×1920px | ✅/❌ |
| 微博横图 | 1920×1080px | ✅/❌ |
| 屏幕显示 | 宽 ≥1080px | ✅/❌ |
| 印刷输出 | DPI ≥300 | ✅/❌ |
```

---

## 注意事项

- 视觉分析基于 Agent 的原生视觉能力，结合 AI-DETECTION-GUIDE.md 和 BRAND-IP-LIBRARY.md 参考标准进行打分
- HEIC 文件在非 macOS 系统需先转换：`sips -s format jpeg input.heic --out output.jpg`
- GPS 坐标可用 OpenStreetMap 反查地名：`https://nominatim.openstreetmap.org/reverse?lat=X&lon=Y&format=json`
- 品牌风险仅为关键词扫描，不能替代法律意见
- 若 exiftool 输出为空（无元数据），这本身是 AI 生成检测的一个重要信号

