最近做某个小项目,项目中用到了很多 icon
图标,我一般都是习惯于直接引用各大图标库,例如 fontawesome、Ionicons、MaterialCommunityIcons等。
由于最近也在关注 SVG
方面的东西,所以我突然想到有些很简单的图标,其实是可以通过 SVG
绘制的,一般做这种的事情得工具应该是 Adobe Illustrator
,但是因为电脑上只安装了 PS
,也懒得再安装一个消耗那么大的软件,所以想着能不能使用 PS
完成这件事。
网上关于 PS
直接导出 svg
路径的文章很少,而且基本上都是相互抄,并且语焉不详,没些踩坑的耐性很难看明白到底说的什么,不过好在最终都被我一一解决了,整理如下。
工具:
Adobe PhotoShop CC 2015 64bit
脚本文件
首先,需要下载一个脚本文件 save-ps-to-svg1.0.jsx,关于此文件的最新信息,可以到 官网查看,将此文件放到 PS
安装目录下的 /Presets/Scripts
文件夹中,如果放置脚本的时候 PS
是打开状态,那么可能需要重启一下。
PS
绘制
- 搞定好脚本之后,打开
PS
,新建图层:
- 图层新建好后,就可以绘制了
不过这里需要注意的是, 无论使用什么工具,想要转换成 SVG
路径,那么都必须要是使用形状工具绘制出来的图像才可以, PS
中的形状工具很好找,下面的几个都是:
这里演示是使用 自定义形状工具,选择了一个气泡形状,在图层上拉一下,画出一个简单气泡:
- 保存文件
保存整个文件,使用默认设置即可:
- 导出
svg
路径
文件保存好后,接下来才能对图层进行转化,鼠标在图层的名称上双击,重命名为以 .svg
为后缀结尾的名字,例如 tosvg.svg
:
重命名完毕后,依次点击 文件–>脚本–>Save as SVG,即可在保存psd
文件的相同目录下输入一份以 .svg
结尾的文件:
目录中的 .svg
文件:
- 查看文件
使用编辑器打开 以.svg
结尾的文件,在文档的底部,可以看到形状的 path
路径(虽然有些不规范):
图层合并
使用形状工具的时候,鼠标的每一次绘制就会产生一个图层,若是直接选中所有图层右键选择合并图层
选项,那么输出的 svg
路径其实是将所有的图层一个个输出,而不是输出图层相交之后的结果。
想要输出图层相交之后的结果路径,首我们可以选中所有图层,在工具栏中选择 减去顶层形状(或者其他选项也可以),最后点击 合并形状组件,这样一来,所有的图层才能彻底合并,使用脚本输出的路径才是合并后图层的路径。
两个问题
- 输出的路径不规范
有时候,输出的路径会是下面这种情况:
每一条路径的后面都有一个字母, 这些字母的大概含义如下:
M = moveto(M X,Y) :将画笔移动到指定的坐标位置
L = lineto(L X,Y) :画直线到指定的坐标位置
H = horizontal lineto(H X):画水平线到指定的X坐标位置
V = vertical lineto(V Y):画垂直线到指定的Y坐标位置
C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次贝赛曲线
S = smooth curveto(S X2,Y2,ENDX,ENDY)
Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY):二次贝赛曲线
T = smooth quadratic Belzier curveto(T ENDX,ENDY):映射
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧线
Z = closepath():关闭路径
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
根据上述,图中 .svg
路径中的字母 m 和 L
我们都知道是什么意思了,但 Y
是什么鬼? V
为什么给了四个数字参数?
很明显,这其中定然有什么我们不确定是不是 bug
的 bug
如何解决
首先可以确定的是,那些字母是错的,但是字母前面的路径是对的。
我的方法是自己根据情况,将那些字母替换成合适的字母。
例如,我所绘制的形状是存在曲线的,二次贝赛曲线Q
一共四个参数,所以我们可以路径中的字母 Y
和 V
换成 Q
,我试了一下,确实是可行的。
- 形状翻转
将 .svg
中给出的 path
路径整理为合乎规范的 path
路径,放到 html
文档中在浏览器中查看,然后与原图对比,左图是我们希望看到的,结果如下,右图是根据 .svg
文件中给出的路径得到的:
稍微对比一下就可以看出,右边的气泡沿着 X轴
翻转 180°
才是左边我们真正想要的。
如何解决?
我的办法是,既然右边的气泡沿着 X轴
翻转 180°
才是左边我们真正想要的,那么我们就手动把它翻转一下好了。
X坐标
是不用动的, 需要我们手动变动的只有 Y坐标
,随便写个翻转 Y坐标
的 JS
函数,把 .svg
文件给出的 path
路径输入即可,JS函数
示例如下:
let reversePath = (path, svgHeight)=> {
let arr=path.split(' ')
for(let i=0;i<arr.length; i++){
i%2===1 ? arr[i] = svgHeight-arr[i] : arr[i] = +arr[i]
}
return arr.join(' ')
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
其中 path
为路径,例如 168.9280 167.9198 164.7704 159.9623 158.2457 155.9885
,如果以 0
位起始,则路径基本上都是奇数位的坐标才是 Y坐标
,所以只需要处理 i%2===1
的,而又因为是相对于整个图层翻转,所以需要知道图层的高度才行,这里的 svgHeight
就是图层的高度。
办法虽然笨了点,但一般我们常用的 svg
形状,转化为路径一般也没多少,最重要的是能够解决问题。
最后
搞定以上问题,花费了我大半个下午的时间,而且,就算是解决了所有问题,但最终想要从 PS
中导出绘制好的形状路径,其中过程未免有些繁琐,所以,如果可以的话,还是直接安装一个诸如 Adobe Illustrator
的专业工具更省心吧。