帝王谷资源网 Design By www.wdxyy.com
今天老板提了需求,要在服务端生成邀请卡,嗯…,简单的说就是把要这张:
变成差多这样的:
后端搞ruby的哥们搞了个html转图片,说转得太慢了,我就把这坑接下来了
所以睡前就倒腾了下,搞了个简单的实现
解决思路
文字转svg -> svg转png -> 合并图片
相关轮子
- images Node.js 轻量级跨平台图像编解码库,不需要额外安装依赖
- text-to-svg 文字转svg
- svg2png svg转png图片
示例代码
'use strict'; const fs = require('fs'); const images = require('images'); const TextToSVG = require('text-to-svg'); const svg2png = require("svg2png"); const Promise = require('bluebird'); Promise.promisifyAll(fs); const textToSVG = TextToSVG.loadSync('fonts/文泉驿微米黑.ttf'); const sourceImg = images('./i/webwxgetmsgimg.jpg'); const sWidth = sourceImg.width(); const sHeight = sourceImg.height(); const svg1 = textToSVG.getSVG('魏长青-人人讲App', { x: 0, y: 0, fontSize: 24, anchor: 'top', }); const svg2 = textToSVG.getSVG('邀请您参加', { x: 0, y: 0, fontSize: 16, anchor: 'top', }); const svg3 = textToSVG.getSVG('人人讲课程', { x: 0, y: 0, fontSize: 32, anchor: 'top', }); Promise.coroutine(function* generateInvitationCard() { const targetImg1Path = './i/1.png'; const targetImg2Path = './i/2.png'; const targetImg3Path = './i/3.png'; const targetImg4Path = './i/qrcode.jpg'; const [buffer1, buffer2, buffer3] = yield Promise.all([ svg2png(svg1), svg2png(svg2), svg2png(svg3), ]); yield Promise.all([ fs.writeFileAsync(targetImg1Path, buffer1), fs.writeFileAsync(targetImg2Path, buffer2), fs.writeFileAsync(targetImg3Path, buffer3), ]); const target1Img = images(targetImg1Path); const t1Width = target1Img.width(); const t1Height = target1Img.height(); const offsetX1 = (sWidth - t1Width) / 2; const offsetY1 = 200; const target2Img = images(targetImg2Path); const t2Width = target2Img.width(); const t2Height = target2Img.height(); const offsetX2 = (sWidth - t2Width) / 2; const offsetY2 = 240; const target3Img = images(targetImg3Path); const t3Width = target3Img.width(); const t3Height = target3Img.height(); const offsetX3 = (sWidth - t3Width) / 2; const offsetY3 = 270; const target4Img = images(targetImg4Path); const t4Width = target4Img.width(); const t4Height = target4Img.height(); const offsetX4 = (sWidth - t4Width) / 2; const offsetY4 = 400; images(sourceImg) .draw(target1Img, offsetX1, offsetY1) .draw(target2Img, offsetX2, offsetY2) .draw(target3Img, offsetX3, offsetY3) .draw(target4Img, offsetX4, offsetY4) .save('./i/card.png', { quality : 90 }); })().catch(e => console.error(e));
注意事项
text-to-svg需要中文字体的支持,不然中文会乱码
在我的破电脑上执行一次只花了500多毫秒,感觉足够了,分享出来希望能给大家一个参照
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
帝王谷资源网 Design By www.wdxyy.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
帝王谷资源网 Design By www.wdxyy.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年10月31日
2024年10月31日
- 英雄联盟最年轻的世界冠军是谁 2024最年轻的世界冠军介绍
- lol暗夜星澜宝典什么时候上线 暗夜星澜宝典上线时间介绍
- 听泉赏宝自称病了准备先沉淀 其鉴宝APP仅剩2个商品
- 令人意外 《蚁人3》其实盈利了一点点:8.8万美元
- 外网比较IGN《黑神话》《龙腾4》评分:这不合理!
- 刘思达.2024-在你闪烁时我开始在意【网易电波】【FLAC分轨】
- 王力宏.2007-改変自己【SONY】【WAV+CUE】
- 群星.2009-田野的春天徐沛东精选作品集【太平洋影音】【WAV+CUE】
- 蔡琴-闽南语十年精选[吉马引进版][WAV+CUE整轨]
- 赵鹏-《王者無疆》Hi-Res24-96[FLAC]
- 赵鹏《我的神话》Hi-Res[24bit-96kHz]【flac】
- 五月天《后青春期的诗》[FLAC][1.91G]
- 伍佰 《伍佰精选-滚石香港黄金十年》 [FLAC 192kHz 24bit][2.5G]
- 许巍《时光漫步》 [FLAC][1.7G]
- 月光鳍用什么鱼饵?月光鳍鱼饵介绍一览