Node.js使用gm拼装sprite图片


Posted in Javascript onJuly 04, 2017

从设计图切图得到了12个小图标,是按钮的两种状态,然后我就寻思着把他们拼成一张sprite图片.

之前用过gulp的sprite插件,但这次我不想搞的太隆重.拼图我知道有个很好用的命令行工具 GraphicsMagick 及配套的nodejs包gm

首先说下我要拼的图片,我打算将正常状态作为第1行,激活状态作为第2行.这样可以少计算一些background-position.

折腾过程比较痛苦,本来我打算看一下GraphicsMagick与gm的官方文档,结果好多生单词,最后还是放弃了.下面说答案吧:

总的来说有两种方法,

1.使用gm包的append+adjoin方法

这个方法有缺点,就是不能方便的排序成我想要的这种布局.用adjoin我实际上拼了3次图,才最终得到sprite.参考代码如下:

gm('nav1_1.png')
 .append('nav2_1.png','nav3_1.png','nav4_1.png','nav5_1.png','nav6_1.png', true)
 .adjoin().write('./result.png', function(err) {
   console.log(err);
 });
 gm('nav1_0.png')
 .append('nav2_0.png','nav3_0.png','nav4_0.png','nav5_0.png','nav6_0.png', true)
 .adjoin().write('./result1.png', function(err) {
   console.log(err);
 });
 
 gm('result1.png').append('result.png').adjoin()
   .write('nav-icons.png', (err, data) => {
     if(err) console.error(err);
     console.log(data);
   })

代码很初级.

2.使用GraphicsMagick自带的命令行工具

是直接使用GraphicsMagick的命令行(安装后,即可在命令行里使用gm命令),但这里要注意:powershell中使用gm一直报错,需要用cmd并cd到对应目录.win10自作聪明的用powershell默认代替cmd,结果连这种错误都没修复…

gm montage nav*_0.png nav*_1.png -tile 6x2 -geometry +0+0 rrr.png

可以看到我使用了 montage 方法,且分两次传入了图片(图片路径还支持glob表达式), 分两次传入图片路径可以保证先后顺序(因为我就是想拼两行啊).

简单讲一下montage,其中文表述即”蒙太奇”,高大上,但我们这里只用来拼图. 命令之后就是图片路径; 路径之后有个 `-tile` 参数, 用来指定图片的排列方式.6×2就是6列2行.这里有个技巧,如果你想让所有图片排成一行,可以这样 `-tile x1`,即不管列数,只限制为1行,反之, `-tile 1x`则表示只要1列不管有多少行.

-tile参数后是-geometry参数. 其默认值是'120×120>+4+3′,表示”每张小图的最大尺寸是120×120,大于此尺寸的会被缩放(小于的不会放大),图片之间的间隔是横向4纵向3″.

-geometry的参数是按需传的,比如我传的只是+0+0,表示不限制每张图的大小,图片间距为0.

最后一个参数,就是输出拼图结果到rrr.png了.

搞懂这些参数后, 下面的由本方法衍生出来的方法就好理解了.

3.使用gm包执行GraphicsMagick命令行

gm包本身十分强大,但它也提供了生成命令并执行的接口.如上面的命令行, 用gm包可以这么写:

gm().command('montage')
   .in('nav*_0.png')
   // 图片路径分开 in, 不要连在一个 in 里面
   .in('nav*_1.png')
   .in('-tile', '6x2')
   .in('-geometry', '+0+0')
   .write('rrrr.png', (err, a,b,c) => {
     console.log(err, 'a:', a, 'b:', b, 'c:', c);
   });

与直接使用命令行是一样的效果.但这样写成js文件后,下次要用或要发给别人用都更方便了.

Javascript 相关文章推荐
jquery 使用点滴函数代码
May 20 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
详解webpack babel的配置
Jan 09 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
Vue常用指令详解分析
Aug 19 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
layui在form表单页面通过Validform加入简单验证的方法
Sep 06 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
JavaScript中document.referrer的用法详解
Jul 04 #Javascript
基于hover的用法实例(推荐)
Jul 04 #Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 #Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
Jul 04 #Javascript
javascript 初学教程及五子棋小程序的简单实现
Jul 04 #Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 #Javascript
JS全角与半角转化实例(分享)
Jul 04 #Javascript
You might like
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python3 Random模块代码详解
2017/12/04 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Python自动化操作实现图例绘制
2020/07/09 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
免税水晶:Duty Free Crystal
2019/05/13 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
新大陆软件面试题
2016/11/24 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
谁动了我的奶酪读书笔记
2015/06/30 职场文书