您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Node.js实现将文字与图片合成技巧

时间:2020-06-22 13:52:43  来源:  作者:
Node.js实现将文字与图片合成技巧

 

作者:诀九 前端名狮

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

前言

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

Node.js实现将文字与图片合成技巧

 

上图实际就是在一张背景图中,加入了一行文字。操作步骤简单,但是每次都需要打开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表示三角形

<!DOCTYPE html>
<html>
<body>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <path d="M150 0 L75 200 L225 200 Z" />
</svg>

</body>
</html>

展示效果:

Node.js实现将文字与图片合成技巧

 

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

let path = require('path');
let TextToSVG = require('text-to-svg');

let fontPath = path.join(__dirname, './fonts/msyhbd.ttf');//字体可以下载或者从本机系统内copy
let 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);

输出结果:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="72" height="47.513671875"><path fill="#FFFFFF"
d="M23.94 7.95L23.94 7.95L29.67 9.39Q28.65 10.65 27.54 11.92L27.54 11.92L35.40 11.92L35.40 16.07L0.56 16.07L0.56 11.92L8.03 11.92Q7.24 10.63 6.40 9.39L6.40 9.39L11.67 7.95Q13.03 9.98 14.22 11.92L14.22 11.92L21.36 11.92Q22.71 9.95 23.94 7.95ZM28.72 35.51L28.72 17.58L33.47 17.58L33.47 37.02Q33.47 39.39 32.43 40.71Q31.39 42.03 29.53 42.28Q27.67 42.54 22.85 42.54L22.85 42.54Q22.54 40.50 21.83 37.58L21.83 37.58Q25.03 37.72 26.68 37.72L26.68 37.72Q28.72 37.72 28.72 35.51L28.72 35.51ZM7.35 34.95L7.35 42.50L2.57 42.50L2.57 18L19.27 18L19.27 37.51Q19.27 39.80 18.21 41.01Q17.16 42.22 15.22 42.37Q13.29 42.52 10.58 42.54L10.58 42.54Q10.02 39.52 9.60 37.86L9.60 37.86Q12.27 38.00 12.76 38.00L12.76 38.00Q14.48 38.00 14.48 36.07L14.48 36.07L14.48 34.95L7.35 34.95ZM14.48 24.82L14.48 22.29L7.35 22.29L7.35 24.82L14.48 24.82ZM7.35 28.62L7.35 31.15L14.48 31.15L14.48 28.62L7.35 28.62ZM21.76 35.33L21.76 18.60L26.16 18.60L26.16 35.33L21.76 35.33ZM69.33 18.18L50.13 18.18L50.13 10.16L54.21 10.16L54.21 14.10L57.45 14.10L57.45 7.95L61.98 7.95L61.98 14.10L65.25 14.10L65.25 10.16L69.33 10.16L69.33 18.18ZM36.88 18.67L36.88 14.24L41.12 14.24Q39.96 11.44 39.02 9.63L39.02 9.63L43.17 7.98Q44.12 9.70 45.74 12.94L45.74 12.94L42.52 14.24L48.52 14.24L48.52 18.67L36.88 18.67ZM44.09 19.41L44.09 19.41L48.34 19.93L45.93 34.00L48.34 33.57Q48.20 34.70 48.02 38.00L48.02 38.00Q43.10 38.85 37.27 40.11L37.27 40.11L36.49 35.51L42.28 34.59Q43.28 27.35 44.09 19.41ZM36.91 20.18L40.71 19.55L42.54 32.27L38.64 32.94Q37.93 26.40 36.91 20.18L36.91 20.18ZM48.87 24.33L48.87 20.18L70.73 20.18L70.73 24.33L61.24 24.33L60.68 26.54L70.24 26.54L70.24 39.90Q70.24 41.75 69.06 42.29Q67.89 42.84 66.29 42.84L66.29 42.84Q65.13 42.84 63.95 42.64L63.95 42.64L63.72 40.89L60.64 40.89L60.64 30.69L58.64 30.69L58.64 40.89L55.20
40.89L55.20 30.69L53.19 30.69L53.19 42.64L49.04 42.64L49.04 26.54L56.30 26.54L56.76 24.33L48.87 24.33ZM66.09 37.97L66.09 30.69L64.09 30.69L64.09 38.74Q65.07 38.85 65.34 38.85L65.34 38.85Q66.13 38.85 66.09 37.97L66.09 37.97Z"/></svg>

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

// 安装sharp
npm install sharp
  1. 官方文档中,用sharp合并图像时,给出的api是 overlayWith,但是你会发现,这个api并不存在。这个是因为sharp最新版本0.23.3删除了overlayWith,用composite进行了替换。

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

Node.js实现将文字与图片合成技巧

 

总结

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



Tags:Node.js   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、安装环境1、本机系统:Windows 10 Pro(64位) 2、Node.js:v12.14.1(64位)二、安装Node.js步骤1、下载对应你系统的Node.js版本: https://nodejs.org/en/download/ 2、选安装目录...【详细内容】
2020-11-26  Tags: Node.js  点击:(105)  评论:(0)  加入收藏
首先你要现在你的电脑上安装好node.js 地址:https://nodejs.org/en/download/ 安装好了会出现这个: 然后写代码://使用Node搭建一个简单的http服务器//加载http模块let http...【详细内容】
2020-10-23  Tags: Node.js  点击:(100)  评论:(0)  加入收藏
yargs 是一个用来处理命令行参数的包,可以帮你处理自行设置的命令行标志和输入的任何类型的数据,其中包括布尔值、浮点数和字符串等。这个包非常简单明了,不需要在项目中编写大量的样板代码。...【详细内容】
2020-10-10  Tags: Node.js  点击:(65)  评论:(0)  加入收藏
沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境,模拟了开放平台部分产品的主要功能和主要逻辑。可用于在产品上线前了解环境、组合和调试各种接口。...【详细内容】
2020-09-17  Tags: Node.js  点击:(187)  评论:(0)  加入收藏
这部分示例将致力于用 Node.js 模拟一个类似于 Apache 的 Web 服务器,处理浏览器端的请求,将相关的页面响应给浏览器。首先,我们要在code目录下执行mkdir 03_webSever命令来创...【详细内容】
2020-08-31  Tags: Node.js  点击:(63)  评论:(0)  加入收藏
Node.js 使用的是 V8 引擎,会自动进行垃圾回收(Garbage Collection,GC),因而写代码的时候不需要像 C/C++ 一样手动分配、释放内存空间,方便不少,不过仍然需要注意内存的使用,避免造成内存泄漏(Memory Leak)。...【详细内容】
2020-08-24  Tags: Node.js  点击:(67)  评论:(0)  加入收藏
Node.js有许多框架可以选择,包括老牌的Express,Koa,新晋的Egg,Nest等等。...【详细内容】
2020-07-12  Tags: Node.js  点击:(68)  评论:(0)  加入收藏
Node.js允许程序员在服务器端使用Javascript语言和脚本,这很快导致它在全世界范围内被迅速采用。Node.js在过去十年里慢慢爬上了流行的阶梯,并根据这次Stack overflow的调查,...【详细内容】
2020-07-09  Tags: Node.js  点击:(141)  评论:(0)  加入收藏
前言本篇文章适用于Node.js(Express后台)+MongoDB开发的项目流程1.远程连接到服务器可以登录阿里云远程连接到自己的服务器,也可以使用git-bash登录:ssh root@公网IP2.更新aptap...【详细内容】
2020-07-04  Tags: Node.js  点击:(39)  评论:(0)  加入收藏
作者:诀九 前端名狮转发链接: https://mp.weixin.qq.com/s/BMg8bFUwa4gmm6v2acAe7Q前言在头条发布文章时,需要为文章配置一个封面图片。我的常规做法就是网上搜一张图片,然后利...【详细内容】
2020-06-22  Tags: Node.js  点击:(117)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条