Transform a folder of unnamed screenshots and a rough markdown draft into a polished, illustrated tutorial document. Use when the user has a set of screenshots (e.g., from Snipaste or other tools) with timestamp-based filenames and a brief markdown outline, and wants to produce a complete step-by-step instructional document with images renamed by content and inserted at appropriate positions. Triggers include "整理截图写文档", "screenshots to tutorial", "rename images and write guide", "把截图整理成教程", or when a folder of screenshots and a markdown draft are provided together.
将一组以时间戳命名的截图和一份粗略的 Markdown 草稿,转化为一份完整的、图文并茂的操作指导文档。自动完成截图内容识别、语义化重命名,以及文档结构补全与图片插入。
列出用户指定文件夹中的所有文件,区分图片文件和文档文件:
# 列出所有文件
ls -la "<target_folder>/"
# 筛选图片文件(支持 png/jpg/jpeg/gif/webp)
find "<target_folder>" -maxdepth 1 -type f \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.gif" -o -name "*.webp" \) | sort
# 筛选 Markdown 文件
find "<target_folder>" -maxdepth 1 -type f -name "*.md"
输出:
使用 macOS 系统自带的 Vision 框架进行 OCR 文字识别,提取每张图片中的关键文字信息。
创建并编译一个 Swift 小工具,调用 macOS Vision 框架:
// ocr_images.swift
import Foundation
import Vision
import AppKit
let args = CommandLine.arguments
guard args.count > 1 else {
print("Usage: ocr_images <image_path>")
exit(1)
}
let imagePath = args[1]
guard let image = NSImage(contentsOfFile: imagePath),
let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) else {
print("ERROR: Cannot load image")
exit(1)
}
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
for observation in observations {
if let topCandidate = observation.topCandidates(1).first {
print(topCandidate.string)
}
}
}
request.recognitionLevel = .accurate
request.recognitionLanguages = ["zh-Hans", "en-US"]
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
编译命令:
swiftc -o ocr_tool ocr_images.swift -framework Vision -framework AppKit
对每张图片执行 OCR,记录识别结果:
for img in "<target_folder>/"*.png; do
echo "=== $(basename "$img") ==="
./ocr_tool "$img"
echo "---"
done
关键信息提取:从 OCR 结果中识别:
根据 OCR 识别出的内容,为每张图片生成语义化文件名。
文件名格式:{序号}-{动作}-{对象}.png
01、02、03...)install、enable、open、select、create)copilot-extension、agent-skills-setting)命名示例:
| OCR 关键内容 | 命名结果 |
|-------------|----------|
| GitHub Copilot 扩展安装页面 | 01-install-copilot-extension.png |
| 设置搜索 chat.useAgentSkills | 04-enable-agent-skills-setting.png |
| git clone 命令 | 10-git-clone-agent-skills-repo.png |
| 资源管理器目录结构 | 11-agent-skills-repo-structure.png |
使用 Python 脚本进行安全的批量重命名(避免 shell 转义问题):
import os
base = "<target_folder>"
renames = {
"<原文件名1>.png": "<新文件名1>.png",
"<原文件名2>.png": "<新文件名2>.png",
# ...
}
for old, new in renames.items():
src = os.path.join(base, old)
dst = os.path.join(base, new)
if os.path.exists(src):
os.rename(src, dst)
print(f"OK: {old} -> {new}")
else:
print(f"SKIP: {old} not found")
注意:文件夹路径包含空格时,shell 的 heredoc 和链式
mv命令容易出错。推荐使用 Python 脚本文件而非内联命令。
读取用户提供的 Markdown 草稿,理解其结构和意图:
cat "<target_folder>/instruction.md"
分析要点:
将草稿扩展为完整的操作指导文档,遵循以下结构规范。
# [文档标题]
[一段简介,说明文档目的和适用对象]
---
## 前置准备
[列出开始操作前需要满足的条件]
### 1. [准备项1]
[详细说明 + 截图]
### 2. [准备项2]
[详细说明 + 截图]
---
## 步骤 N:[步骤标题]
[简要说明本步骤的目的]
### N.1 [子步骤]
[操作说明]

### N.2 [子步骤]
[操作说明]
> **说明/提示:** [补充说明]
---
## 常见问题
| 问题 | 解决方案 |
|------|----------|
| ... | ... |
# 到 ####,层级不超过4级**粗体** 标注```bash ``` 包裹> **说明:** 或 > **注意:** 添加补充信息--- 分隔将重命名后的图片以 Markdown 语法插入到文档的对应位置。

![]() 中的 alt 文字应准确描述图片内容,方便搜索和无障碍访问### 2. 安装 GitHub Copilot 扩展
在 VS Code 的扩展市场中搜索 **GitHub Copilot** 并安装:

完成文档后进行以下检查:
# 提取文档中所有图片引用
grep -oP '!\[.*?\]\(\K[^)]+' "<target_folder>/instruction.md"
# 对比实际图片文件
ls "<target_folder>/"*.png
# 检查是否有孤立图片(未被文档引用)或断链引用(文件不存在)
路径含空格时(如 skill instruction/),shell 命令容易出错。应对策略:
某些截图可能是纯图形、图标或高度风格化的文字,OCR 无法识别。处理方式:
05-step5-ui-overview.png)如果草稿仅有几个关键词,需要:
Vision 框架仅限 macOS。在其他平台上:
tesseract 和 pytesseractbrew install tesseract(macOS 备选)或使用在线 OCR APInpx skills add opensourceways/tutorial-generating下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Category:other