【Node】一键生成博客标题图片

简介: 还在为写文章时找不到标题图片而困扰吗?举个例子,CSDN的博客文章如果你不给他图片的话,那么它会按照一些默认的标签图片作为你的文章封面,例如下面这样。

闲谈

还在为写文章时找不到标题图片而困扰吗?举个例子,CSDN的博客文章如果你不给他图片的话,那么它会按照一些默认的标签图片作为你的文章封面,例如下面这样。

但这样有一个问题,如果你写了很多篇的前端文章,那么这些图片都是#前端,就不好通过这些封面图片分辨不同的文章了,为了解决这个问题,本篇文章于是就应运而生啦。

正文

需求和环境搭建

我的需求:我打算通过一个带标题的请求生成对应的一张标题图片。

所以我需要使用一个后端框架作为服务层,这里我采用的是NodeExpress框架。

由于我要导出图片,我需要canvas的依赖。

注: 这个canvas依赖不是很好装,如果大家装失败了,可以查看廖雪峰大佬的这个帖子学习下:

https://www.liaoxuefeng.com/article/937567769853440

现在万事具备,于是我们开始操作,我们打开命令行,准备开始一顿敲击。注意:以下环境是在Mac下操作的

# 创建项目名称为TurnTextToImage
mkdir TurnTextToImage && cd TurnTextToImage
# 初始化一个npm项目
npm init -y
# 安装Express依赖
npm install express --save
# 安装Canvas的前置依赖
brew install pkg-config cairo pango libpng jpeg giflib
# 安装canvas
npm install canvas
# 创建一个主文件
touch app.js

撰写代码

  1. 首先我们采用Get请求,因为Get请求比Post请求容易。而且Get请求可以通过浏览器直接访问得到结果,不需要通过Postman等其他工具,易于操作。对于Express框架,拿到Get请求中查询为Text的数据可以通过如下方式:
// 假设请求参数中包含要转换的文字
const text = req.query.text;

举个🌰,对于localhost:3000/text=测试的请求,我们的text就是测试

  1. 然后我们使用Canvas,确定照片的长宽,在把我们的文字画出来即可。
const canvas = createCanvas(800 * 2, 600 * 2);
const ctx = canvas.getContext("2d");
// 加入文本且让文本居中
ctx.fillText(
  text,
  (canvas.width - ctx.measureText(text).width) / 2,
  canvas.height / 2
);
  1. 最后将照片导出成流的形式,传给浏览器就可以啦。
// 将画布内容转为PNG格式的Buffer
  const imgBuffer = canvas.toBuffer("image/png");
  // 设置HTTP响应头和发送图片Buffer
  res.set({
    "Content-Type": "image/png",
    "Content-Length": imgBuffer.length,
  });
  res.send(imgBuffer);

以下是所有的代码

const express = require("express");
const app = express();
const { createCanvas } = require("canvas");
// 注意请求的前缀是 /text-to-image
app.get("/text-to-image", async (req, res) => {
  // 假设请求参数中包含要转换的文字
  const text = req.query.text; 
  // 创建画布和上下文
  const canvas = createCanvas(800 * 2, 600 * 2);
  const ctx = canvas.getContext("2d");
  // 设置背景色为黑色
  ctx.fillStyle = "#000000"; // 黑色背景
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  // 设置字体样式并且绘制
  ctx.font = "72px Microsoft YaHei";
  ctx.fillStyle = "#ffffff"; // 白色文本
  ctx.fillText(
    text,
    (canvas.width - ctx.measureText(text).width) / 2,
    canvas.height / 2
  );
  // 将画布内容转为PNG格式的Buffer
  const imgBuffer = canvas.toBuffer("image/png");
  // 设置HTTP响应头和发送图片Buffer
  res.set({
    "Content-Type": "image/png",
    "Content-Length": imgBuffer.length,
  });
  res.send(imgBuffer);
});
app.listen(3000, () => console.log("Server listening on port 3000"));

让我们通过node app.js将服务起起来,然后在浏览器上输入即可看到效果

http://localhost:3000/text-to-image?text=【Node】一键生成博客标题图片

效果如下:

目录
相关文章
|
7月前
|
Web App开发 存储 JavaScript
基于Node.js的简易博客系统设计与实现
基于Node.js的简易博客系统设计与实现
156 3
|
7月前
|
JavaScript 前端开发 安全
使用 Node.js 插件给指定目录下的所有图片添加上文字水印
使用 Node.js 插件给指定目录下的所有图片添加上文字水印
177 0
|
2月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
JavaScript 前端开发
Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo
如何使用Vue和Element UI配合Node.js及multiparty模块实现图片上传并反显的功能,包括前端的Element UI组件配置和后端的Node.js服务端代码实现。
64 1
|
3月前
|
前端开发 JavaScript
node接收前端上传的图片,单文件、多文件同name、多文件不同name
本文介绍了在Node.js中使用multer模块接收前端上传的图片,包括单文件上传、多文件上传(同name和不同name)以及任意类型文件上传的方法。
105 0
|
5月前
【node】图片验证码(svg-captcha)
【node】图片验证码(svg-captcha)
307 0
|
5月前
|
缓存 jenkins 应用服务中间件
Node实现CSDN博客导出(后续)
Node实现CSDN博客导出(后续)
33 0
|
6月前
|
数据采集 存储 编解码
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
108 0
|
6月前
|
数据采集 Web App开发 XML
详尽分享用Node.js写爬虫,撸羞羞的图片
详尽分享用Node.js写爬虫,撸羞羞的图片
40 0
|
7月前
|
编解码 前端开发 JavaScript
node实战——koa实现文件下载和图片/pdf/视频预览(node后端储备知识)
node实战——koa实现文件下载和图片/pdf/视频预览(node后端储备知识)
340 1