图片格式检测器
功能概述
判断用户输入的文件路径对应的图片真实格式,支持 JPG/JPEG、PNG、WebP 三种格式。通过读取文件头(魔数/Magic Number)识别,不依赖文件扩展名,可检测出扩展名与实际格式不符的情况。
环境说明
- 本 Skill 无需脚本,直接通过系统命令读取文件头字节判断格式
- 本 Skill 运行命令时采用条件执行(前一条成功才执行下一条),跨平台规则如下:
- bash/zsh(Linux/macOS):
cmd1 && cmd2 - PowerShell 5(Windows):
cmd1; if ($?) { cmd2 }(PowerShell 5 不支持&&) - PowerShell 7+:
&&和; if ($?) { cmd2 }均可,为最大兼容性推荐; if ($?) { cmd2 } - 禁止单
&:在 bash 中&表示后台执行,语义完全不同 - 示例(bash/zsh):
test -f "$path" && xxd -l 12 -p "$path" - 示例(PowerShell 5):
Test-Path "$path"; if ($?) { [System.IO.File]::ReadAllBytes("$path")[0..11] }
- bash/zsh(Linux/macOS):
文件头魔数对照表
| 格式 | 偏移 | 魔数(十六进制) | 说明 |
|---|---|---|---|
| JPG | 0 | FF D8 FF |
前 3 字节 |
| PNG | 0 | 89 50 4E 47 0D 0A 1A 0A |
前 8 字节(即 ‰PNG\r\n\x1A\n) |
| WebP | 0 | 52 49 46 46 + 4字节长度 + 57 45 42 50 |
前4字节为 RIFF,偏移 8-11 为 WEBP |
执行步骤
| 步骤 | 执行动作 | 具体命令/操作 |
| ---- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------- |
| 1 | 接收文件路径 | 从用户消息中提取图片文件的绝对路径,记为 <文件路径> |
| 2 | 验证文件存在 | Windows PowerShell:运行 Test-Path "<文件路径>",返回 True 即存在Linux/macOS bash:运行 test -f "<文件路径>" && echo "exists" |
| 3 | 读取文件头12字节 | Windows PowerShell:运行 $bytes = [System.IO.File]::ReadAllBytes("<文件路径>")[0..11]; $hex = ($bytes | ForEach-Object { $\_.ToString("X2") }) -join " "; Write-Output $hexLinux/macOS bash:运行 xxd -l 12 -p "<文件路径>" | tr -d '\n' | sed 's/\(..\)/\1 /g'说明:读取前 12 字节足以覆盖所有三种格式的魔数判断 |
| 4 | 判断格式 | 将读取的十六进制字符串(统一转为大写)与【文件头魔数对照表】比对,按以下优先级判断:• 以 FF D8 FF 开头 -> 判定为 JPG/JPEG• 以 89 50 4E 47 开头 -> 判定为 PNG• 以 52 49 46 46 开头,且偏移 8-11 字节为 57 45 42 50 -> 判定为 WebP• 以上均不匹配 -> 判定为 未知格式 |
| 5 | 提取扩展名 | 从 <文件路径> 中提取文件扩展名(最后一个 . 之后的部分,转小写),用于与真实格式比对 |
| 6 | 输出结果 | 按【输出格式】输出判断结果 |
输出格式
判断完成后,输出以下结构化信息:
图片格式检测结果:
- 文件路径:{用户输入的路径}
- 文件扩展名:{从路径提取的扩展名,如 .jpg / .png / .webp / 无扩展名}
- 真实格式:{JPG / PNG / WebP / 未知格式}
- 扩展名是否匹配:{是 / 否}
若扩展名与真实格式不符(如 .jpg 文件实际为 PNG),需在结果后追加提示:
⚠️ 注意:该文件的扩展名(.jpg)与真实格式(PNG)不符,建议修正扩展名或使用支持该格式的工具打开。
错误处理
| 错误场景 | 错误表现 | 处理方式 |
|---|---|---|
| 文件不存在 | Test-Path 返回 False |
中断执行,提示用户"文件路径不存在,请确认路径是否正确" |
| 路径无权限 | 读取文件头报错"拒绝访问" | 中断执行,提示用户"没有读取该文件的权限,请检查文件权限设置" |
| 文件过小 | 文件字节数少于 12 | 读取实际可用字节数进行判断;若不足 3 字节则判定为"未知格式" |
| 未知格式 | 文件头不匹配任何已知魔数 | 输出"未知格式",并附上读取到的文件头十六进制值供用户参考 |
| 路径含空格 | 命令解析错误 | 路径须用双引号包裹(PowerShell 和 bash 均适用双引号,bash 中避免用单引号以支持变量展开) |
| 命令不可用 | Linux/macOS 下 xxd 未安装 |
回退使用 od -A x -t x1 -N 12 "<文件路径>" 命令读取文件头 |