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高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
uploadify在Firefox下丢失session问题的解决方法
Aug 07 Javascript
js中事件的处理与浏览器对象示例介绍
Nov 29 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
JS实现进入页面时渐变背景色的方法
Feb 25 Javascript
javascript的理解及经典案例分析
May 20 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
Feb 21 Javascript
用Vue写一个分页器的示例代码
Apr 22 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 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
php 在文件指定行插入数据的代码
2010/05/08 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
初学Javascript的一些总结
2008/11/03 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
在django中自定义字段Field详解
2019/12/03 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
实习自荐信
2013/10/13 职场文书
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
基于python实现银行管理系统
2021/04/20 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
详解Vue的列表渲染
2021/11/20 Vue.js