@sakitam-gis/sprite-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 sakitam-fdd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/QUICK_START.md ADDED
@@ -0,0 +1,582 @@
1
+ # 快速开始指南
2
+
3
+ 本文档将指导您快速上手 `@sakitam-gis/sprite-cli` - 一个现代化的雪碧图生成工具。
4
+
5
+ ## 📋 目录
6
+
7
+ - [安装](#-安装)
8
+ - [基本使用](#-基本使用)
9
+ - [命令行选项](#-命令行选项)
10
+ - [高级功能](#-高级功能)
11
+ - [元数据支持](#-元数据支持)
12
+ - [PNG 优化](#-png-优化)
13
+ - [实际应用场景](#-实际应用场景)
14
+ - [常见问题](#-常见问题)
15
+
16
+ ## 🎯 前置要求
17
+
18
+ - Node.js >= 18.0.0
19
+ - npm、pnpm 或 yarn 包管理器
20
+
21
+ 推荐使用 **pnpm** 以获得更好的性能和磁盘空间利用率。
22
+
23
+ ## 📦 安装
24
+
25
+ ### 方式 1: 全局安装(推荐)
26
+
27
+ 适用于命令行直接使用:
28
+
29
+ ```bash
30
+ # npm
31
+ npm install -g @sakitam-gis/sprite-cli
32
+
33
+ # pnpm(推荐)
34
+ pnpm add -g @sakitam-gis/sprite-cli
35
+
36
+ # yarn
37
+ yarn global add @sakitam-gis/sprite-cli
38
+ ```
39
+
40
+ ### 方式 2: 项目本地安装
41
+
42
+ 适用于在项目构建流程中使用:
43
+
44
+ ```bash
45
+ # npm
46
+ npm install --save-dev @sakitam-gis/sprite-cli
47
+
48
+ # pnpm
49
+ pnpm add -D @sakitam-gis/sprite-cli
50
+
51
+ # yarn
52
+ yarn add -D @sakitam-gis/sprite-cli
53
+ ```
54
+
55
+ 然后在 `package.json` 中添加脚本:
56
+
57
+ ```json
58
+ {
59
+ "scripts": {
60
+ "build:sprites": "sprite-maker output/sprite icons/",
61
+ "build:sprites:retina": "sprite-maker output/sprite@2x icons/ --retina"
62
+ }
63
+ }
64
+ ```
65
+
66
+ ### 方式 3: 使用 npx(无需安装)
67
+
68
+ 适用于临时使用或测试:
69
+
70
+ ```bash
71
+ npx @sakitam-gis/sprite-cli output/sprite icons/
72
+ ```
73
+
74
+ ## 🚀 基本使用
75
+
76
+ ### 1. 准备图标文件
77
+
78
+ 创建一个目录,放入您的 SVG 或 PNG 图标文件:
79
+
80
+ ```
81
+ icons/
82
+ ├── home.svg
83
+ ├── user.svg
84
+ ├── settings.svg
85
+ ├── logo.png
86
+ └── ...
87
+ ```
88
+
89
+ **支持的文件格式:**
90
+ - ✅ SVG(推荐)- 矢量图形,自动优化
91
+ - ✅ PNG - 光栅图像
92
+
93
+ ### 2. 生成雪碧图
94
+
95
+ 最简单的用法:
96
+
97
+ ```bash
98
+ sprite-maker output/sprite icons/
99
+ ```
100
+
101
+ 这将生成两个文件:
102
+ - **`output/sprite.png`** - 合成的雪碧图图片
103
+ - **`output/sprite.json`** - 布局和元数据信息
104
+
105
+ ### 3. 查看输出
106
+
107
+ **sprite.json 示例:**
108
+
109
+ ```json
110
+ {
111
+ "home": {
112
+ "width": 24,
113
+ "height": 24,
114
+ "x": 0,
115
+ "y": 0,
116
+ "pixelRatio": 1
117
+ },
118
+ "user": {
119
+ "width": 24,
120
+ "height": 24,
121
+ "x": 24,
122
+ "y": 0,
123
+ "pixelRatio": 1
124
+ }
125
+ }
126
+ ```
127
+
128
+ ## 🔧 命令行选项
129
+
130
+ ### 完整语法
131
+
132
+ ```bash
133
+ sprite-maker [output] [input] [options]
134
+ ```
135
+
136
+ ### 参数说明
137
+
138
+ | 参数 | 说明 | 示例 |
139
+ |------|------|------|
140
+ | `output` | 输出文件路径(不含扩展名)或目录 | `sprites/icon` 或 `sprites/` |
141
+ | `input` | 输入图标目录 | `icons/` |
142
+ | `options` | 可选参数 | 见下表 |
143
+
144
+ ### 可选参数
145
+
146
+ | 选项 | 说明 | 类型 | 默认值 | 示例 |
147
+ |------|------|------|--------|------|
148
+ | `--retina` | 生成 2x 像素比率(等同于 --ratio=2) | boolean | `false` | `--retina` |
149
+ | `--ratio=<n>` | 指定像素比率 | number | `1` | `--ratio=3` |
150
+ | `--unique` | 去重模式,相同图像只存储一次 | boolean | `false` | `--unique` |
151
+ | `--colors=<n>` | PNG 颜色数量(2-256) | number | `256` | `--colors=128` |
152
+ | `--quality=<n>` | PNG 质量(0-100) | number | `80` | `--quality=90` |
153
+ | `--palette` | 使用调色板模式压缩 PNG | boolean | `false` | `--palette` |
154
+ | `--help, -h` | 显示帮助信息 | - | - | `--help` |
155
+
156
+ ## 🎨 高级功能
157
+
158
+ ### 1. Retina 显示屏支持
159
+
160
+ 为高 DPI 显示屏生成多种分辨率:
161
+
162
+ ```bash
163
+ # 1x (标准)
164
+ sprite-maker output/sprite icons/
165
+
166
+ # 2x (Retina)
167
+ sprite-maker output/sprite@2x icons/ --retina
168
+
169
+ # 3x (超高清)
170
+ sprite-maker output/sprite@3x icons/ --ratio=3
171
+ ```
172
+
173
+ 生成文件:
174
+ ```
175
+ output/
176
+ ├── sprite.png (1x)
177
+ ├── sprite.json
178
+ ├── sprite@2x.png (2x)
179
+ ├── sprite@2x.json
180
+ ├── sprite@3x.png (3x)
181
+ └── sprite@3x.json
182
+ ```
183
+
184
+ **在 Web 应用中使用多分辨率雪碧图:**
185
+
186
+ ```css
187
+ /* 标准屏幕 */
188
+ .icon {
189
+ background-image: url('sprite.png');
190
+ }
191
+
192
+ /* Retina 屏幕 */
193
+ @media (-webkit-min-device-pixel-ratio: 2),
194
+ (min-resolution: 192dpi) {
195
+ .icon {
196
+ background-image: url('sprite@2x.png');
197
+ background-size: 50%; /* 重要:缩放到原始尺寸 */
198
+ }
199
+ }
200
+ ```
201
+
202
+ ### 2. Unique 模式(去重)
203
+
204
+ 当多个图标指向相同的图像时,使用 unique 模式可以减小文件大小:
205
+
206
+ ```bash
207
+ sprite-maker output/sprite icons/ --unique
208
+ ```
209
+
210
+ **示例场景:**
211
+ ```
212
+ icons/
213
+ ├── icon-a.svg (内容相同)
214
+ ├── icon-b.svg (内容相同)
215
+ └── icon-c.svg (内容不同)
216
+ ```
217
+
218
+ 在 unique 模式下:
219
+ - `icon-a` 和 `icon-b` 将指向同一个图像位置
220
+ - 雪碧图文件更小
221
+ - JSON 中仍包含所有图标的布局信息
222
+
223
+ ### 3. 自动目录创建
224
+
225
+ 输出目录不存在时会自动创建:
226
+
227
+ ```bash
228
+ # 即使 output/sprites/ 不存在也会自动创建
229
+ sprite-maker output/sprites/icon icons/
230
+ ```
231
+
232
+ ### 4. 默认文件名
233
+
234
+ 如果只指定目录作为输出路径,会自动生成默认文件名:
235
+
236
+ ```bash
237
+ # 输出:sprites/sprite.png 和 sprites/sprite.json
238
+ sprite-maker sprites/ icons/
239
+
240
+ # 输出:sprites/sprite@2x.png 和 sprites/sprite@2x.json
241
+ sprite-maker sprites/ icons/ --retina
242
+ ```
243
+
244
+ ## 📋 元数据支持
245
+
246
+ 本工具支持提取和处理 **Mapbox 9-patch 风格的元数据**,用于可拉伸图像和内容区域定义。
247
+
248
+ ### 在 SVG 中定义元数据
249
+
250
+ 使用特殊的 `id` 属性来标记元数据区域:
251
+
252
+ ```xml
253
+ <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
254
+ <!-- 主图标内容 -->
255
+ <rect width="24" height="24" fill="#333"/>
256
+
257
+ <!-- 水平拉伸区域 (9-patch) -->
258
+ <path id="mapbox-stretch-x" d="M 8 0 L 16 0 L 16 24 L 8 24 Z" fill="none"/>
259
+
260
+ <!-- 垂直拉伸区域 (9-patch) -->
261
+ <path id="mapbox-stretch-y" d="M 0 8 L 24 8 L 24 16 L 0 16 Z" fill="none"/>
262
+
263
+ <!-- 内容区域 -->
264
+ <path id="mapbox-content" d="M 4 4 L 20 4 L 20 20 L 4 20 Z" fill="none"/>
265
+
266
+ <!-- 文本占位符区域 -->
267
+ <path id="mapbox-text-placeholder" d="M 6 6 L 18 6 L 18 18 L 6 18 Z" fill="none"/>
268
+ </svg>
269
+ ```
270
+
271
+ ### 元数据类型说明
272
+
273
+ | ID 前缀 | 类型 | 说明 | 输出格式 |
274
+ |---------|------|------|----------|
275
+ | `mapbox-stretch-x` | 水平拉伸 | 定义水平方向可拉伸区域 | `[[x1, x2], ...]` |
276
+ | `mapbox-stretch-y` | 垂直拉伸 | 定义垂直方向可拉伸区域 | `[[y1, y2], ...]` |
277
+ | `mapbox-stretch` | 双向拉伸 | 同时定义水平和垂直拉伸 | 同时输出 X 和 Y |
278
+ | `mapbox-content` | 内容区域 | 定义可放置内容的区域 | `[left, top, right, bottom]` |
279
+ | `mapbox-text-placeholder` | 文本占位符 | 定义文本占位符区域 | `[left, top, right, bottom]` |
280
+
281
+ ### 输出的元数据格式
282
+
283
+ 生成的 JSON 文件将包含元数据:
284
+
285
+ ```json
286
+ {
287
+ "button": {
288
+ "width": 24,
289
+ "height": 24,
290
+ "x": 0,
291
+ "y": 0,
292
+ "pixelRatio": 1,
293
+ "metadata": {
294
+ "stretchX": [[8, 16]],
295
+ "stretchY": [[8, 16]],
296
+ "content": [4, 4, 20, 20],
297
+ "placeholder": [6, 6, 18, 18]
298
+ }
299
+ }
300
+ }
301
+ ```
302
+
303
+ ### 元数据的应用场景
304
+
305
+ 1. **可拉伸按钮** - 定义边框和中间可拉伸区域
306
+ 2. **9-patch 图像** - Android 风格的可缩放图像
307
+ 3. **弹性面板** - 可自适应内容的 UI 组件
308
+ 4. **文本框背景** - 带有文本占位符的输入框
309
+
310
+ ## 🗜️ PNG 优化
311
+
312
+ 本工具使用 **Sharp** 库对生成的 PNG 文件进行高级优化。
313
+
314
+ ### 优化选项
315
+
316
+ #### 1. 颜色量化
317
+
318
+ 减少颜色数量以降低文件大小:
319
+
320
+ ```bash
321
+ # 使用 128 色调色板(默认 256 色)
322
+ sprite-maker output/sprite icons/ --colors=128
323
+ ```
324
+
325
+ **推荐值:**
326
+ - `256` - 最高质量(默认)
327
+ - `128` - 高质量,文件较小
328
+ - `64` - 中等质量,文件更小
329
+ - `32` - 低质量,最小文件
330
+
331
+ #### 2. 质量设置
332
+
333
+ 调整 PNG 压缩质量:
334
+
335
+ ```bash
336
+ # 90% 质量(默认 80%)
337
+ sprite-maker output/sprite icons/ --quality=90
338
+ ```
339
+
340
+ **推荐值:**
341
+ - `90-100` - 高质量,文件较大
342
+ - `80-89` - 平衡质量和大小(推荐)
343
+ - `60-79` - 较小文件,质量略降
344
+ - `< 60` - 不推荐
345
+
346
+ #### 3. 调色板模式
347
+
348
+ 启用调色板模式进一步压缩:
349
+
350
+ ```bash
351
+ sprite-maker output/sprite icons/ --palette
352
+ ```
353
+
354
+ **效果:**
355
+ - ✅ 大幅减小文件大小(通常 30-50%)
356
+ - ⚠️ 可能轻微影响颜色精度
357
+ - ✅ 适用于图标和简单图形
358
+
359
+ #### 4. 组合使用
360
+
361
+ 结合多个选项获得最佳效果:
362
+
363
+ ```bash
364
+ # 最小文件大小(适用于图标)
365
+ sprite-maker output/sprite icons/ --palette --colors=64 --quality=75
366
+
367
+ # 高质量压缩(适用于复杂图形)
368
+ sprite-maker output/sprite icons/ --colors=256 --quality=90
369
+
370
+ # 平衡模式(推荐)
371
+ sprite-maker output/sprite icons/ --palette --colors=128 --quality=80
372
+ ```
373
+
374
+ ### 优化效果对比
375
+
376
+ | 配置 | 文件大小 | 质量 | 适用场景 |
377
+ |------|----------|------|----------|
378
+ | 默认 | 100% | 优秀 | 通用 |
379
+ | `--palette --colors=128` | ~60% | 良好 | 图标、简单图形 |
380
+ | `--palette --colors=64` | ~40% | 中等 | 图标(不追求完美) |
381
+ | `--quality=90` | ~110% | 极佳 | 需要高保真的场景 |
382
+
383
+ ## 💡 实际应用场景
384
+
385
+ ### 场景 1: Web 应用图标
386
+
387
+ ```bash
388
+ # 生成多分辨率图标
389
+ sprite-maker dist/icons/sprite icons/ --unique
390
+ sprite-maker dist/icons/sprite@2x icons/ --retina --unique
391
+ sprite-maker dist/icons/sprite@3x icons/ --ratio=3 --unique
392
+ ```
393
+
394
+ **使用方式:**
395
+
396
+ ```html
397
+ <!-- HTML -->
398
+ <div class="icon icon-home"></div>
399
+ ```
400
+
401
+ ```css
402
+ /* CSS */
403
+ .icon {
404
+ display: inline-block;
405
+ background-image: url('/icons/sprite.png');
406
+ background-repeat: no-repeat;
407
+ }
408
+
409
+ @media (-webkit-min-device-pixel-ratio: 2) {
410
+ .icon {
411
+ background-image: url('/icons/sprite@2x.png');
412
+ background-size: 50%;
413
+ }
414
+ }
415
+
416
+ .icon-home {
417
+ width: 24px;
418
+ height: 24px;
419
+ background-position: 0px 0px;
420
+ }
421
+ ```
422
+
423
+ ### 场景 2: Mapbox/MapLibre 地图样式
424
+
425
+ ```bash
426
+ # 生成地图图标雪碧图
427
+ sprite-maker map-styles/sprite map-icons/
428
+ sprite-maker map-styles/sprite@2x map-icons/ --retina
429
+ ```
430
+
431
+ **在地图样式中使用:**
432
+
433
+ ```json
434
+ {
435
+ "sprite": "https://example.com/map-styles/sprite",
436
+ "layers": [
437
+ {
438
+ "id": "poi-labels",
439
+ "type": "symbol",
440
+ "layout": {
441
+ "icon-image": "marker",
442
+ "icon-size": 1
443
+ }
444
+ }
445
+ ]
446
+ }
447
+ ```
448
+
449
+ ### 场景 3: 游戏精灵表
450
+
451
+ ```bash
452
+ # 生成游戏角色精灵表(PNG 输入)
453
+ sprite-maker game/sprites/characters characters/*.png --unique --palette
454
+ ```
455
+
456
+ ### 场景 4: 移动应用资源
457
+
458
+ ```bash
459
+ # iOS 和 Android 多分辨率资源
460
+ sprite-maker mobile/assets/icons@1x icons/
461
+ sprite-maker mobile/assets/icons@2x icons/ --ratio=2
462
+ sprite-maker mobile/assets/icons@3x icons/ --ratio=3
463
+ ```
464
+
465
+ ### 场景 5: 构建流程集成
466
+
467
+ **package.json:**
468
+
469
+ ```json
470
+ {
471
+ "scripts": {
472
+ "prebuild": "npm run build:sprites",
473
+ "build:sprites": "npm run sprites:1x && npm run sprites:2x",
474
+ "sprites:1x": "sprite-maker public/sprites/icon assets/icons/ --palette --unique",
475
+ "sprites:2x": "sprite-maker public/sprites/icon@2x assets/icons/ --retina --palette --unique",
476
+ "watch:sprites": "chokidar 'assets/icons/**/*.svg' -c 'npm run build:sprites'"
477
+ }
478
+ }
479
+ ```
480
+
481
+ ## ❓ 常见问题
482
+
483
+ ### Q1: 生成的 PNG 文件太大,如何优化?
484
+
485
+ **A:** 使用优化选项:
486
+
487
+ ```bash
488
+ sprite-maker output/sprite icons/ --palette --colors=128 --quality=80
489
+ ```
490
+
491
+ ### Q2: 支持哪些图像格式?
492
+
493
+ **A:**
494
+ - ✅ SVG(推荐)- 矢量图形,自动优化
495
+ - ✅ PNG - 光栅图像
496
+ - ❌ JPEG、GIF、WebP - 不支持
497
+
498
+ ### Q3: 如何处理大量图标?
499
+
500
+ **A:** 工具已针对性能优化:
501
+ - 自动并发处理
502
+ - SVG 缓存机制
503
+ - 可处理 500+ 图标
504
+
505
+ ```bash
506
+ # 大批量图标建议使用 unique 模式和优化
507
+ sprite-maker output/sprite icons/ --unique --palette --colors=128
508
+ ```
509
+
510
+ ### Q4: unique 模式什么时候使用?
511
+
512
+ **A:** 在以下情况使用:
513
+ - 多个图标共享相同图像
514
+ - 需要减小文件大小
515
+ - 图标库有别名(如 `home` 和 `house` 指向同一图标)
516
+
517
+ ### Q5: 元数据没有被提取?
518
+
519
+ **A:** 检查:
520
+ 1. SVG 中的 `id` 属性是否以 `mapbox-` 开头
521
+ 2. 路径(`<path>`)元素是否有有效的 `d` 属性
522
+ 3. 查看生成的 JSON 文件中的 `metadata` 字段
523
+
524
+ ### Q6: 如何在 CI/CD 中使用?
525
+
526
+ **A:** 添加到构建脚本:
527
+
528
+ ```yaml
529
+ # GitHub Actions 示例
530
+ - name: Install sprite-cli
531
+ run: npm install -g @sakitam-gis/sprite-cli
532
+
533
+ - name: Generate sprites
534
+ run: |
535
+ sprite-maker dist/sprite assets/icons/
536
+ sprite-maker dist/sprite@2x assets/icons/ --retina
537
+ ```
538
+
539
+ ### Q7: 输出目录不存在会报错吗?
540
+
541
+ **A:** 不会,工具会自动创建输出目录。
542
+
543
+ ### Q8: 可以只生成 JSON 不生成 PNG 吗?
544
+
545
+ **A:** 目前不支持,JSON 和 PNG 总是一起生成。
546
+
547
+ ### Q9: 支持自定义布局算法吗?
548
+
549
+ **A:** 目前使用固定的 Shelf Best Height Fit 算法,空间利用率达 80-95%,无需自定义。
550
+
551
+ ### Q10: 如何调试生成错误?
552
+
553
+ **A:**
554
+ 1. 检查输入文件格式是否正确
555
+ 2. 确保 SVG 文件有明确的 `width` 和 `height` 或 `viewBox`
556
+ 3. 查看控制台输出的警告信息
557
+
558
+ ## 📚 相关资源
559
+
560
+ - [README.md](./README.md) - 项目主文档
561
+ - [CHANGELOG.md](./CHANGELOG.md) - 版本更新历史
562
+ - [GitHub Issues](https://github.com/sakitam-gis/sprite-cli/issues) - 问题反馈
563
+ - [NPM Package](https://www.npmjs.com/package/@sakitam-gis/sprite-cli) - NPM 主页
564
+
565
+ ## 🆘 获取帮助
566
+
567
+ 如果您遇到问题或有建议:
568
+
569
+ 1. 查看本文档的 [常见问题](#-常见问题) 部分
570
+ 2. 查看 [GitHub Issues](https://github.com/sakitam-gis/sprite-cli/issues) 中是否有类似问题
571
+ 3. 提交新的 [Issue](https://github.com/sakitam-gis/sprite-cli/issues/new)
572
+
573
+ ## 🎉 开始使用
574
+
575
+ 现在您已经了解了所有功能,开始生成您的第一个雪碧图吧!
576
+
577
+ ```bash
578
+ # 快速开始
579
+ sprite-maker output/sprite icons/
580
+ ```
581
+
582
+ Happy sprite making! 🚀