图片处理 php node,node实现文字生成图片

本文主要介绍了node文字转图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

今天老板提了需求,要在服务端生成邀请卡,嗯…,简单的说就是把要这张:

a6e7aa4b3eadf27461c8636f78b0fd50.png

变成差多这样的:

后端搞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多毫秒,感觉足够了,分享出来希望能给大家一个参照

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值