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 相关文章推荐
Javascript与flash交互通信基础教程
Aug 07 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
Mar 31 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
利用Bootstrap实现表格复选框checkbox全选
Dec 21 Javascript
如何学JavaScript?前辈的经验之谈
Dec 28 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
Vue组件开发技巧总结
Mar 04 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 Javascript
node.js基础知识汇总
Aug 25 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
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
详解KMP算法以及python如何实现
2020/09/18 Python
详解Python流程控制语句
2020/10/28 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
什么是方法的重载
2013/06/24 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
业务部经理岗位职责
2014/01/04 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
结婚保证书范文
2014/04/29 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
竞选学委演讲稿
2014/09/13 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
三严三实学习心得体会
2014/10/13 职场文书
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server