作者:诀九 前端名狮

转发链接:https://mp.weixin.qq.com/s/BMg8bFUwa4gmm6v2acAe7Q

前言

在头条发布文章时,需要为文章配置一个封面图片。我的常规做法就是网上搜一张图片,然后利用 PhotoShop,在图片上加入文章标题,然后导出生成图片,如下图所示:

上图实际就是在一张背景图中,加入了一行文字。操作步骤简单,但是每次都需要打开PhotoShop修改文字,感觉麻烦、工作重复。

能不能用代码,解决日常生活中遇到的重复性工作呢?

实现方案

整体思路:

文字和图形不能直接合并,需要将文字先转换成图形,然后再将图形进行合并,大致步骤如下:

  1. 利用text-to-svg,将文字转成SVG图形;
  2. 利用sharp,将SVG图形与背景图片合并;

分析实现:

1. 将文字转为SVG图形

将文字转换为SVG图形,需要借助Node的模块text-to-png,该模块能够将文字按照指定字体生成SVG图形。

SVG 意为可缩放矢量图形(Scalable Vector Graphics),放缩时不损失图形质量,SVG 是使用 XML 格式定义的图像,如下所示:

在html页面中嵌入了一个SVG表示三角形

html>  

展示效果:

SVG很好的充当了中间变量的角色,言归正传,看下代码如何实现转换:

let path = require('path');let TextToSVG = require('text-to-svg');let fontPath = path.join(__dirname, './fonts/msyhbd.ttf');//字体可以下载或者从本机系统内copylet textToSVG = TextToSVG.loadSync(fontPath); // 加载字体文件let options = {    x: 0,         //文本开头的水平位置(默认值:0)    y: 0,         // 文本的基线的垂直位置(默认值:0)    fontSize: 36, // 字体大小    anchor: 'top', // 坐标中的对象锚点    // letterSpacing: "",  // 设置字母的间距    attributes: {        fill: '#FFFFFF' // 文字颜色    }}let textSVG = textToSVG.getSVG('【前端名狮】', options);console.log(textSVG);

输出结果:

2. 合并图形

用于合并图片的库有很多,比如gm、jimp、mapnik、sharp等,其中sharp是基于libvips库来实现的,性能是最高的,所以我采用了sharp来合并图形。

let textSVG = Buffer.from(textSVG);let bgPath = path.join(__dirname, './img/bg.jpg');let targetPath = path.join(__dirname, '../dist/bg.jpg');sharp(bgPath).composite([{        input: textSVG,        gravity: 'center'    }]).toFile(targetPath);

sharp库注意事项

  1. 因为libvips是基于c++实现的,所以sharp库需要基于C++源代码进行编译构建后才能使用。node-gyp是为node编译C++扩展的时候使用的编译工具,但是node-gyp依赖python和VC++构建工具来进行编译。所以需要先安装python 和 VC++ 环境。最简单的方式就是顺序执行下面安装命令:
// 安装构建环境python、vc++npm install --global --production windows-build-tools// 安装node-gyp 编译工具npm install --global node-gyp// 安装sharpnpm install sharp
  1. 官方文档中,用sharp合并图像时,给出的api是 overlayWith,但是你会发现,这个api并不存在。这个是因为sharp最新版本0.23.3删除了overlayWith,用composite进行了替换。

至此,我们就实现了一个简单的生成公众号封面图片的功能,让我们看看生成效果:

总结

程序可以帮助我们干重复的事情,提高我们的生产力,如果程序员写的代码都用于解决自己生活中遇到的问题,对程序员无疑是巨大的动力源泉。

推荐JavaScript经典实例学习资料文章

《爱奇艺云剪辑Web端的技术实现》

《我再也不敢说我会写前端 Button组件「实践」》

《NodeX Component - 滴滴集团 Node.js 生态组件体系「实践」》

《Node Buffers 完整指南》

《推荐18个webpack精美插件「干货」》

《前端开发需要了解常用7种JavaScript设计模式》

《浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务》

《了不起的 Webpack HMR 学习指南(上)「含源码讲解」》

《了不起的 Webpack HMR 学习指南(下)「含源码讲解」》

《10个打开了我新世界大门的 WebAPI(上)「实践」》

《10个打开了我新世界大门的 WebAPI(中)「实践」》

《10个打开了我新世界大门的 WebAPI(下)「实践」》

《「图文」ESLint 在中大型团队的应用实践》

《Deno是代码的浏览器,你认同吗?》

《前端存储除了 localStorage 还有啥?》

《Javascript 多线程编程​的前世今生》

《微前端方案 qiankun(实践及总结)》

《「图文」V8 垃圾回收原来这么简单?》

《Webpack 5模块联邦引发微前端的革命?》

《基于 Web 端的人脸识别身份验证「实践」》

《「前端进阶」高性能渲染十万条数据(时间分片)》

《「前端进阶」高性能渲染十万条数据(虚拟列表)》

《图解 Promise 实现原理(一):基础实现》

《图解 Promise 实现原理(二):Promise 链式调用》

《图解 Promise 实现原理(三):Promise 原型方法实现》

《图解 Promise 实现原理(四):Promise 静态方法实现》

《实践教你从零构建前端 Lint 工作流「干货」》

《高性能多级多选级联组件开发「JS篇」》

《深入浅出讲解Node.js CLI 工具最佳实战》

《延迟加载图像以提高Web网站性能的五种方法「实践」》

《比较 JavaScript 对象的四种方式「实践」》

《使用Service Worker让你的 Web 应用如虎添翼(上)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(中)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(下)「干货」》

《前端如何一次性处理10万条数据「进阶篇」》

《推荐三款正则可视化工具「JS篇」》

《如何让用户选择是否离开当前页面?「JS篇」》

《JavaScript开发人员更喜欢Deno的五大原因》

《仅用18行JavaScript实现一个倒数计时器》

《图文细说JavaScript 的运行机制》

《一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索》

《推荐Web程序员常用的15个源代码编辑器》

《10个实用的JS技巧「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》

《深入JavaScript教你内存泄漏如何防范》

《手把手教你7个有趣的JavaScript 项目-上「附源码」》

《手把手教你7个有趣的JavaScript 项目-下「附源码」》

《JavaScript 使用 mediaDevices API 访问摄像头自拍》

《手把手教你前端代码如何做错误上报「JS篇」》

《一文让你彻底搞懂移动前端和Web 前端区别在哪里》

《63个JavaScript 正则大礼包「值得收藏」》

《提高你的 JavaScript 技能10 个问答题》

《JavaScript图表库的5个首选》

《一文彻底搞懂JavaScript 中Object.freeze与Object.seal的用法》

《可视化的 JS:动态图演示 - 事件循环 Event Loop的过程》

《教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」》

《可视化的 js:动态图演示 Promises & Async/Await 的过程》

《原生JS封装拖动验证滑块你会吗?「实践」》

《如何实现高性能的在线 PDF 预览》

《细说使用字体库加密数据-仿58同城》

《Node.js要完了吗?》

《Pug 3.0.0正式发布,不再支持 Node.js 6/8》

《纯JS手写轮播图(代码逻辑清晰,通俗易懂)》

《JavaScript 20 年 中文版之创立标准》

《值得收藏的前端常用60余种工具方法「JS篇」》

《箭头函数和常规函数之间的 5 个区别》

《通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events》

《「前端篇」不再为正则烦恼》

《「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能》

《深入细品浏览器原理「流程图」》

《JavaScript 已进入第三个时代,未来将何去何从?》

《前端上传前预览文件 image、text、json、video、audio「实践」》

《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》

《推荐13个有用的JavaScript数组技巧「值得收藏」》

《前端必备基础知识:window.location 详解》

《不要再依赖CommonJS了》

《犀牛书作者:最该忘记的JavaScript特性》

《36个工作中常用的JavaScript函数片段「值得收藏」》

《Node + H5 实现大文件分片上传、断点续传》

《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》

《【实践总结】关于小程序挣脱枷锁实现批量上传》

《手把手教你前端的各种文件上传攻略和大文件断点续传》

《字节跳动面试官:请你实现一个大文件上传和断点续传》

《谈谈前端关于文件上传下载那些事【实践】》

《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》

《最全的 JavaScript 模块化方案和工具》

《「前端进阶」JS中的内存管理》

《JavaScript正则深入以及10个非常有意思的正则实战》

《前端面试者经常忽视的一道JavaScript 面试题》

《一行JS代码实现一个简单的模板字符串替换「实践」》

《JS代码是如何被压缩的「前端高级进阶」》

《前端开发规范:命名规范、html规范、css规范、js规范》

《【规范篇】前端团队代码规范最佳实践》

《100个原生JavaScript代码片段知识点详细汇总【实践】》

《关于前端174道 JavaScript知识点汇总(一)》

《关于前端174道 JavaScript知识点汇总(二)》

《关于前端174道 JavaScript知识点汇总(三)》

《几个非常有意思的javascript知识点总结【实践】》

《都2020年了,你还不会JavaScript 装饰器?》

《JavaScript实现图片合成下载》

《70个JavaScript知识点详细总结(上)【实践】》

《70个JavaScript知识点详细总结(下)【实践】》

《开源了一个 JavaScript 版敏感词过滤库》

《送你 43 道 JavaScript 面试题》

《3个很棒的小众JavaScript库,你值得拥有》

《手把手教你深入巩固JavaScript知识体系【思维导图】》

《推荐7个很棒的JavaScript产品步骤引导库》

《Echa哥教你彻底弄懂 JavaScript 执行机制》

《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》

《深入解析高频项目中运用到的知识点汇总【JS篇】》

《JavaScript 工具函数大全【新】》

《从JavaScript中看设计模式(总结)》

《身份证号码的正则表达式及验证详解(JavaScript,Regex)》

《浏览器中实现JavaScript计时器的4种创新方式》

《Three.js 动效方案》

《手把手教你常用的59个JS类方法》

《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》

《深入浅出讲解 js 深拷贝 vs 浅拷贝》

《手把手教你JS开发H5游戏【消灭星星】》

《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》

《手把手教你全方位解读JS中this真正含义【实践】》

《书到用时方恨少,一大波JS开发工具函数来了》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《手把手教你JS 异步编程六种方案【实践】》

《让你减少加班的15条高效JS技巧知识点汇总【实践】》

《手把手教你JS开发H5游戏【黄金矿工】》

《手把手教你JS实现监控浏览器上下左右滚动》

《JS 经典实例知识点整理汇总【实践】》

《2.6万字JS干货分享,带你领略前端魅力【基础篇】》

《2.6万字JS干货分享,带你领略前端魅力【实践篇】》

《简单几步让你的 JS 写得更漂亮》

《恭喜你获得治疗JS this的详细药方》

《谈谈前端关于文件上传下载那些事【实践】》

《面试中教你绕过关于 JavaScript 作用域的 5 个坑》

《Jquery插件(常用的插件库)》

《【JS】如何防止重复发送ajax请求》

《JavaScript+Canvas实现自定义画板》

《Continuation 在 JS 中的应用「前端篇」》

作者:诀九 前端名狮

转发链接:https://mp.weixin.qq.com/s/BMg8bFUwa4gmm6v2acAe7Q

javascript实现图片轮播_Node.js实现将文字与图片合成技巧相关推荐

  1. H5图片切换,js图片轮播,js图片自动切换

    没有插入图片,效果如下: 注意:下面代码为PC端显示样式,如果要放在手机端,需要微调下style #wrapper.#banner..bg width 自行修改,我的手机端iphone5s 为 wid ...

  2. 基于面向对象的图片轮播(js原生代码)

    无论你想走多远,你都需要不断地走下去.前端最精华的便是原生的js,这也是我们前端工程师的技术分层的重要指标,也提现这你的代码能力,开发的水平.废话不多说,进入今天的主要分享----基于面向对象思想的图 ...

  3. html原生js实现图片轮播,原生JS实现图片轮播切换效果

    原生JS实现图片轮播切换效果 2019-01-06 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了原生JS实现图片轮播切换效果,编程之家小编觉得挺不错的,现在分 ...

  4. html5圆形图片轮播,jQuery超酷响应式圆形图片轮播图特效

    mislider是一款效果非常酷的jQuery响应式圆形图片轮播图特效插件.该轮播图特效可以将图片以圆形图片显示,然后使图片无限循环形成轮播图或旋转木马特效.该轮播图插件的特点有: 使用简单 在同一个 ...

  5. html 图片轮播渐变,js轮播图自动切换和css做页面自动渐变

    js轮播图自动切换和css页面自动渐变 效果如下: 可以去jq官网学习:http://www.jq22.com/ 部分代码如下: *{margin: 0; padding: 0;} p{text-al ...

  6. 图片轮播的JS和CSS实现

    JS实现方法: //实现自动轮播 function autoMove() {if (n >= (count - 1)) {n = 0;} else {++n;}$(".body1 .a ...

  7. html原生js实现图片轮播,原生js实现简单轮播图

    本文实例为大家分享了js实现简单轮播图的具体代码,供大家参考,具体内容如下 一.写入网页基本结构 body: 网页的最外部设置一个id为wrap的容器,取代body,这样方便我们做一些初始化 css: ...

  8. html轮播图添加文字,(swiper插件)轮播图,下面的文字随图片进行翻页

    效果:(图片来源网路) Html: 广播通知:你好 你好你好!!!! 欢迎来到这里,welcome,这是轮播图的第二条消息 css: *{ margin:0; padding:0; } .slider ...

  9. 图片轮播html实现原理,纯CSS实现图片轮播

    原文:http://www.aichengxu.com/view/4182590 关键点:利用keyframes 原理:infinite 注意点:在处理关键帧动画的时候,注意处理好 总共花费的 ani ...

  10. 旋转图片轮播html,js实现旋转图片轮播

    2018-08-18 话不多说,直接上代码 html: css: * { margin: 0; padding: 0; } body { background: #000; overflow: hid ...

最新文章

  1. c语言一行黑白相间的瓷砖,C语言编程练习15:贴瓷砖
  2. 【并发编程】Future模式及JDK中的实现
  3. Java设计模式之适配器模式
  4. Qt设置应用程序图标
  5. Java中可变长参数的使用及注意事项
  6. radmin提示授权码过期_IdentityServer4 客户端授权模式(Client Credentials)
  7. 运行QQ出现initialization failure 0x0000000c错误和浏览器上不了网
  8. python安装jupyter出现问题_有关jupyterhub安装的问题
  9. Android 使用Nginx rtmp 模块
  10. 查询相关股票十档行情的方法
  11. python中break continue exit() pass区别
  12. UiPath PDF操作
  13. 快速实现三菱Q系列PLC连接OPC服务器与物联网平台
  14. 经纬财富:巴中美联储措辞乐观 白银难突出重围
  15. 新人带团队五步骤(其中相互竞争是生有体会的好,团队文化也是)
  16. win10电脑解决 SYSTEM_THREAD_EXCEPTION_NOT_HANDLED 蓝屏
  17. 清华文康活动特刊:多重活动分享贴,不来你就OUT啦
  18. option 82是dhcp报文中的中继代理
  19. MySQL 系统表损坏导致xtrabackup备份失败Cannot open filepath
  20. 华为将欧拉系统捐赠给开放原子基金会?用自己的电脑来安装体验一下欧拉系统吧(图文)

热门文章

  1. PMP项目管理-项目成本管理(3)
  2. Pytorch-《Deep learning with pytorch》1.2.1训练imagenetmini
  3. 在word中如何制作问卷调查?原来是使用word控件技巧!
  4. Hadoop培训视频教程
  5. lighttpd支持AJAX吗,lighttpd配置https
  6. YY0709标准解读
  7. 《2022中国PaaS市场研究及选型评估报告》正式发布
  8. html图片闪烁设置,HTMLCSS基础-图片按钮闪烁解决方案
  9. Xcode8 解决控制台输出
  10. Netty高性能之道1-传统RPC调用性能差的三宗罪