|
1 | 1 | # strokeoil · 图片逐笔重绘 |
2 | 2 |
|
3 | | -把任意图片重绘成「一笔一笔画出来」的过程动画,内置 **四种绘画风格**:油画、线描、色块、素描。 |
| 3 | +把任意图片重绘成「一笔一笔画出来」的过程动画,内置 **八种风格**:油画、线描、色块、素描、水墨、点彩、霓虹、像素。 |
4 | 4 | **纯前端实现,图片不上传、无需后端**,可直接托管到 GitHub Pages。 |
5 | 5 |
|
6 | 6 | 仓库:<https://github.com/tyuecode/tyuecode.github.io> |
7 | 7 |
|
8 | 8 | 在线体验:<https://tangyue.me/> |
9 | 9 |
|
10 | | -## 四种风格 |
| 10 | +## 八种风格 |
11 | 11 |
|
12 | | -| 风格 | 工序 | 效果 | 适合 | |
13 | | -|---|---|---|---| |
14 | | -| **油画** | 刷底色 → 起稿 → 单色底层 → 铺大色 → 塑造 → 塑形 → 罩染 → 干扫 → 细部 → 提白 | 十道古典工序,笔触有起收锋、笔毛分叉、颜料渐枯、厚涂浮雕、罩染透叠 | 人像、风景,想要「真在画画」的质感 | |
15 | | -| **线描** | 定形 → 勾主线 → 结构线 → 细描 → 点睛 | 近黑底上的细白线,只勾结构不铺色,像版画稿/工程图 | 线条为主的原图、想要高对比的图 | |
16 | | -| **色块** | 铺底色 → 暗部色块 → 中间调 → 亮部 → 点缀 | k-means 分层后逐层平涂硬边色块,限量配色的海报感 | 扁平/插画风,做海报和封面 | |
17 | | -| **素描** | 起形 → 铺调子 → 排线 → 交叉线 → 提亮 | 纸底石墨排线,顺结构走向,暗部交叉线压深 | 想要手绘草稿感、练习用的稿子 | |
| 12 | +| 风格 | 工序 | 效果 | |
| 13 | +|---|---|---| |
| 14 | +| **油画** | 刷底色 → 起稿 → 单色底层 → 铺大色 → 塑造 → 塑形 → 罩染 → 干扫 → 细部 → 提白 | 十道古典工序,起收锋、笔毛分叉、颜料渐枯、厚涂浮雕、罩染透叠 | |
| 15 | +| **线描** | 定形 → 勾主线 → 结构线 → 细描 → 点睛 | 近黑底上的细白线,只勾结构,像版画稿 | |
| 16 | +| **色块** | 铺底色 → 暗部色块 → 中间调 → 亮部 → 点缀 | 分层平涂的硬边色块,限量配色的海报感 | |
| 17 | +| **素描** | 起形 → 铺调子 → 排线 → 交叉线 → 提亮 | 纸底石墨排线,顺结构走向,暗部交叉线压深 | |
| 18 | +| **水墨** | 铺水 → 勾线 → 渲染 → 皴擦 → 点苔 → 留白 | 宣纸墨色,浓淡枯湿靠叠墨,留白透气 | |
| 19 | +| **点彩** | 底色 → 中层 → 密集 → 边界 → 高光 | 密集小色点堆成画面,颜色靠视觉混色 | |
| 20 | +| **霓虹** | 铺底 → 主线 → 细线 → 光晕 → 亮点 | 深底发光线条,像通电的招牌 | |
| 21 | +| **像素** | 低分辨率 → 中分辨率 → 细化 → 高光格 | 量化成方格逐格点亮,复古游戏感 | |
18 | 22 |
|
19 | 23 | 每种风格都有自己的一套工序、笔触语言和底纹,**不是同一套笔刷换配色**: |
20 | | -线描的线是贴着 Canny 脊线吸附出来的,色块是把分层区域用 marching squares 抽成轮廓直接填充, |
21 | | -素描的排线按局部明暗分四遍逐层压深。三种的笔触数据结构也各不相同(线 / 闭合填充 / 排线)。 |
| 24 | +线描的线贴着 Canny 脊线吸附;色块把分层区域抽成轮廓直接填充;素描按明暗分四遍排线; |
| 25 | +水墨用叠墨做浓淡、把纹理压到最疏;点彩是六边形错排撒点、暗部点更大以免白纸透出; |
| 26 | +霓虹用加色混合做辉光但主体走正常混合(否则密集处会叠成白);像素先铺大格再补细格。 |
22 | 27 |
|
23 | 28 | ## 特点 |
24 | 29 |
|
25 | | -- 🎨 **四种风格**:油画 / 线描 / 色块 / 素描,各有一套工序和笔触语言 |
| 30 | +- 🎨 **八种风格**:油画 / 线描 / 色块 / 素描 / 水墨 / 点彩 / 霓虹 / 像素,各有一套工序和笔触语言 |
26 | 31 | - 🖌 **物理笔触**:起收锋、笔毛分叉、颜料渐枯、厚涂浮雕、罩染透叠 |
27 | 32 | - 🔒 **本地处理**:图片只在你的浏览器里,绝不联网上传 |
28 | 33 | - 📦 **可下载**:生成结果打包成单个 HTML 文件,双击离线播放、随意分享 |
|
43 | 48 | | 文件 | 说明 | |
44 | 49 | |---|---| |
45 | 50 | | `index.html` | 主页面(上传、选风格、调参、实时预览、下载) | |
46 | | -| `core.js` | 分析 + 四种风格的笔触生成 + 时间轴 | |
| 51 | +| `core.js` | 分析 + 八种风格的笔触生成 + 时间轴 | |
47 | 52 | | `render.js` | 共用的笔触渲染器(网页预览与播放器共用,保证所见即所得) | |
48 | 53 | | `worker.js` | Web Worker,后台生成不卡界面 | |
49 | 54 | | `player-template.html` | 下载用的单文件播放器模板(内联 `render.js`) | |
@@ -74,14 +79,14 @@ window.OIL_BUILD = '20261111-4style'; |
74 | 79 |
|
75 | 80 | ## 技术实现 |
76 | 81 |
|
77 | | -**分析一次,四种风格共用。** 先在降采样后的工作分辨率上算一张「结构图」: |
| 82 | +**分析一次,八种风格共用。** 先在降采样后的工作分辨率上算一张「结构图」: |
78 | 83 |
|
79 | 84 | 1. **分层**:在 L\*(亮度)× S(饱和度)平面上做 k-means(k-means++ 初始化),把画面按材质和明暗分开 |
80 | 85 | 2. **边缘**:两套 Canny(粗 σ=3.0 出主要轮廓,细 σ=1.2 出细节边缘),双阈值 + 滞后连接 |
81 | 86 | 3. **方向场**:结构张量(Sobel → 特征分解)求每个像素的主导走向;平坦区改用低频方向场,避免笔触乱指 |
82 | 87 | 4. **显著性**:梯度幅值 + 方向一致性 + 细边缘密度加权,告诉笔触「哪里值得多画几笔」 |
83 | 88 |
|
84 | | -四种风格从同一张结构图出发,各取所需: |
| 89 | +八种风格从同一张结构图出发,各取所需: |
85 | 90 |
|
86 | 91 | - **油画**:网格播种 → 沿方向场行走 → 按显著性分配笔宽和密度,七道工序逐层加细 |
87 | 92 | - **线描**:种子只撒在 Canny 脊线上,行走时向法线方向吸附(`requireEdge`),走偏即止;用 `maxTurn` 限制转角,防止笔画打卷成毛线团 |
|
0 commit comments