update at 2026-02-07 11:30:18
This commit is contained in:
244
README.md
244
README.md
@@ -1,136 +1,130 @@
|
|||||||
# 图片转SVG工具
|
# font2svg
|
||||||
|
|
||||||
将图片中的黑色部分提取并转换为高保真 SVG,基于 `potrace` 描边以保证准确还原。
|
一个基于 Vue 3 + TypeScript 的本地字体预览与导出工具。
|
||||||
|
|
||||||
## 功能特点
|
核心目标:从本地字体库中选择字体,实时生成文本预览,并导出为 `SVG` 或 `PNG`。
|
||||||
|
|
||||||
- 自动提取黑色区域(Otsu 自动阈值)
|
## 界面快照
|
||||||
- 透明通道白底合成,避免边缘污染
|
|
||||||
- `potrace` 高精度矢量化,支持孔洞
|
|
||||||
- 默认保真优先(关闭曲线优化)
|
|
||||||
- 支持圆拟合简化(近似圆轮廓可替代为圆弧)
|
|
||||||
|
|
||||||
## 安装依赖
|

|
||||||
|
|
||||||
```bash
|
## 当前功能
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
### 安装 potrace(必需)
|
- 字体库加载
|
||||||
|
- 从 `frontend/public/fonts.json` 读取字体清单
|
||||||
```bash
|
- 支持按分类展示字体树
|
||||||
brew install potrace
|
- 支持收藏字体列表
|
||||||
```
|
- 预览控制
|
||||||
|
- 勾选字体进入预览
|
||||||
### 字体转SVG依赖
|
- 多字体并行预览
|
||||||
|
- 预览项可单独勾选用于导出
|
||||||
用于 `font2svg.py`(字形轮廓输出):
|
- 文本输入
|
||||||
|
- 输入框支持手动回车换行
|
||||||
```bash
|
- 自动按每行 45 字换行(保留手动换行)
|
||||||
pip install fonttools uharfbuzz
|
- 样式控制
|
||||||
```
|
- 字号滑块(10 ~ 500)
|
||||||
|
- 文字颜色选择
|
||||||
## 使用方法
|
- 导出
|
||||||
|
- 支持导出 `SVG`
|
||||||
### 基本用法
|
- 支持导出 `PNG`(由 SVG 转换)
|
||||||
|
- 多项导出自动打包 zip
|
||||||
```bash
|
- 导出文件名规则:`字体名_内容前8字.扩展名`
|
||||||
python pic2svg.py input.png
|
|
||||||
```
|
|
||||||
|
|
||||||
这将在同一目录生成 `input.svg` 文件。
|
|
||||||
|
|
||||||
### 指定输出目录
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python pic2svg.py input.png --outdir svg
|
|
||||||
```
|
|
||||||
|
|
||||||
### 常用参数示例
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 使用固定阈值
|
|
||||||
python pic2svg.py input.png --threshold 128
|
|
||||||
|
|
||||||
# 保真优先(默认参数)
|
|
||||||
python pic2svg.py input.png --turdsize 0 --opttolerance 0 --unit 1
|
|
||||||
|
|
||||||
# 文件更小(可能略失真)
|
|
||||||
python pic2svg.py input.png --optimize-curves --opttolerance 0.2
|
|
||||||
|
|
||||||
# 圆拟合简化(仅当轮廓接近圆时生效)
|
|
||||||
python pic2svg.py input.png --circle-fit 0.02
|
|
||||||
|
|
||||||
# 批量转换(输入目录)
|
|
||||||
python pic2svg.py --indir images --outdir svg
|
|
||||||
```
|
|
||||||
|
|
||||||
### 字体转SVG(新脚本)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python font2svg.py --font path/to/font.ttf --text "Hello"
|
|
||||||
python font2svg.py --font font/XCDUANZHUANGSONGTI.ttf --text "星程紫微" --outdir svg
|
|
||||||
python font2svg.py --font path/to/font.ttf --text "Hello" --letter-spacing 20
|
|
||||||
python font2svg.py --fontdir font --text "星程紫微" --outdir svg
|
|
||||||
```
|
|
||||||
|
|
||||||
说明:单字体输出文件名根据 `--text` 自动生成;使用 `--fontdir` 时会加上字体名作为前缀。
|
|
||||||
|
|
||||||
## 参数说明
|
|
||||||
|
|
||||||
| 参数 | 说明 | 默认值 |
|
|
||||||
|------|------|--------|
|
|
||||||
| `input` | 输入图片路径(必需) | - |
|
|
||||||
| `--indir` | 输入目录(批量转换) | - |
|
|
||||||
| `--outdir` | 输出目录(自动创建,使用输入文件名.svg) | - |
|
|
||||||
| `--threshold` | 固定阈值(0-255),未设置则使用Otsu | - |
|
|
||||||
| `--turdsize` | 抑制噪点面积阈值(potrace -t) | 0 |
|
|
||||||
| `--opttolerance` | 曲线优化容差(potrace -O) | 0.0 |
|
|
||||||
| `--unit` | 坐标量化单位(potrace -u) | 1 |
|
|
||||||
| `--optimize-curves` | 启用曲线优化(更小但可能略失真) | 关闭 |
|
|
||||||
| `--circle-fit` | 圆拟合误差阈值(相对半径),>0启用圆替代 | 0.0 |
|
|
||||||
|
|
||||||
### font2svg 参数说明
|
|
||||||
|
|
||||||
| 参数 | 说明 | 默认值 |
|
|
||||||
|------|------|--------|
|
|
||||||
| `--font` | 字体文件路径(ttf/otf) | - |
|
|
||||||
| `--text` | 文字内容 | - |
|
|
||||||
| `--outdir` | 输出目录(自动创建) | - |
|
|
||||||
| `--letter-spacing` | 字距(字体单位) | 0 |
|
|
||||||
| `--fontdir` | 字体目录(遍历ttf/otf) | - |
|
|
||||||
|
|
||||||
## 批量转换
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python pic2svg.py --indir images --outdir output
|
|
||||||
```
|
|
||||||
|
|
||||||
## 工作原理
|
|
||||||
|
|
||||||
1. 读取图像,透明通道白底合成
|
|
||||||
2. 灰度化 + Otsu 反色二值化
|
|
||||||
3. 若启用 `--circle-fit`,先尝试圆拟合替代
|
|
||||||
4. 写入 PBM 位图
|
|
||||||
5. `potrace` 描边生成 SVG(圆拟合失败时回退)
|
|
||||||
|
|
||||||
## 故障排除
|
|
||||||
|
|
||||||
**细节缺失或断裂**:降低 `turdsize`,关闭 `--optimize-curves`,必要时设置更合适的 `--threshold`。
|
|
||||||
|
|
||||||
**文件过大**:开启 `--optimize-curves` 或适当增大 `--opttolerance`。
|
|
||||||
|
|
||||||
**边缘毛刺**:尝试调整 `--threshold`,或先对原图做轻微去噪。
|
|
||||||
|
|
||||||
**圆拟合过于粗糙**:减小 `--circle-fit` 或关闭圆拟合。
|
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
|
|
||||||
- Python 3.6+
|
- `Vue 3`
|
||||||
- OpenCV / NumPy
|
- `TypeScript`
|
||||||
- potrace
|
- `Vite`
|
||||||
- fonttools / uharfbuzz
|
- `Pinia`
|
||||||
|
- `UnoCSS`
|
||||||
|
- `opentype.js`
|
||||||
|
- `harfbuzzjs`
|
||||||
|
- `jszip`
|
||||||
|
|
||||||
## License
|
## 目录说明
|
||||||
|
|
||||||
MIT
|
- `frontend/`: 前端应用源码
|
||||||
|
- `frontend/public/fonts/`: 前端静态字体目录(由脚本生成)
|
||||||
|
- `frontend/public/fonts.json`: 字体清单(由脚本生成)
|
||||||
|
- `font/`: 原始字体目录(按分类子目录组织)
|
||||||
|
- `scripts/generate-font-list.py`: 生成 `fonts.json`
|
||||||
|
- `scripts/copy-fonts.py`: 复制字体到 `frontend/public/fonts`
|
||||||
|
|
||||||
|
## 环境要求
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- pnpm 8+
|
||||||
|
- Python 3(用于字体准备脚本)
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
### 1. 安装依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm -C frontend install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 准备字体
|
||||||
|
|
||||||
|
将字体放入如下结构:
|
||||||
|
|
||||||
|
```text
|
||||||
|
font/
|
||||||
|
手写/
|
||||||
|
字体A.ttf
|
||||||
|
黑体/
|
||||||
|
字体B.otf
|
||||||
|
```
|
||||||
|
|
||||||
|
然后执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run prepare-fonts
|
||||||
|
```
|
||||||
|
|
||||||
|
该命令会:
|
||||||
|
|
||||||
|
1. 扫描 `font/` 生成 `frontend/public/fonts.json`
|
||||||
|
2. 复制字体到 `frontend/public/fonts/`
|
||||||
|
|
||||||
|
### 3. 启动开发环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
默认由 Vite 启动前端开发服务。
|
||||||
|
|
||||||
|
## 常用命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动开发
|
||||||
|
pnpm run dev
|
||||||
|
|
||||||
|
# 构建(调用 frontend build)
|
||||||
|
pnpm run build
|
||||||
|
|
||||||
|
# 本地预览构建产物
|
||||||
|
pnpm run preview
|
||||||
|
|
||||||
|
# 重新生成字体清单并复制字体
|
||||||
|
pnpm run prepare-fonts
|
||||||
|
```
|
||||||
|
|
||||||
|
## 导出行为说明
|
||||||
|
|
||||||
|
- 单个选中项:直接下载对应文件(`svg` 或 `png`)
|
||||||
|
- 多个选中项:打包 zip 下载
|
||||||
|
- SVG: `font2svg-svg-export.zip`
|
||||||
|
- PNG: `font2svg-png-export.zip`
|
||||||
|
- 导出前会自动清理失效选中项,避免导出已不在当前预览列表中的字体
|
||||||
|
|
||||||
|
## 文本布局说明
|
||||||
|
|
||||||
|
- 输入文本会先做换行标准化(`\r\n` -> `\n`)
|
||||||
|
- 每行超过 45 字会自动分行
|
||||||
|
- SVG 高度按字形真实边界计算,不额外添加内置 padding
|
||||||
|
|
||||||
|
## 旧脚本说明
|
||||||
|
|
||||||
|
仓库仍保留 `pic2svg.py` / `font2svg.py` 等 Python 脚本,用于历史流程或离线转换;当前主交互流程以上述 `frontend/` Web 应用为准。
|
||||||
|
|||||||
BIN
frontend/assets/snapshot.png
Normal file
BIN
frontend/assets/snapshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 473 KiB |
Reference in New Issue
Block a user