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 相关文章推荐
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
Sep 08 Javascript
javascript div 遮罩层封锁整个页面
Jul 10 Javascript
jQuery :nth-child前有无空格的区别分析
Jul 11 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
Jan 09 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
vue-router重定向不刷新问题的解决
Jun 25 Javascript
VUE 全局变量的几种实现方式
Aug 22 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
Sep 21 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 Javascript
uni-app使用countdown插件实现倒计时
Nov 01 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
德生9700DX电路分析
2021/03/02 无线电
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php中switch语句用法详解
2015/08/17 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
python3之微信文章爬虫实例讲解
2017/07/12 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
J2EE相关知识面试题
2013/08/26 面试题
企业宣传策划方案
2014/05/29 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python