nodejs 文字转图片方法

这个博客介绍了一个使用Node.js和`node-canvas`模块将文字转化为图片的方法。`writeTextToCanvas`函数接受文字和配置选项,如字体、填充、描边颜色等,然后创建并返回一个包含指定文字的canvas对象,最后可以将其转换为Base64编码的图片数据。

引用示例

import writeTextToCanvas from "./core/clip/TextHandler/writeTextToCanvas.js"; 
let text="文字转图片";
let options = {
    font: "16px sans-serif",  
    fill: true,
    stroke: false,
    fillColor: "#ffff00",
    strokeColor: "#000000",
    strokeWidth: 1,
    backgroundColor:  "#00000000",
    padding: 2
};
let canvas=writeTextToCanvas(text,options); 
let base64 = canvas.toDataURL();

使用了node-canvas模块

/**
 * 文字转图片方法
 * @param {*} text 
 * @param {*} options 
 * @returns 
 */
function writeTextToCanvas(text, options) {
    let font =options.font;
    let fontArr=font.split(' ');
    let fontSize=11;
    fontArr.map((v, i) => {
        if (v.indexOf('px') > -1) {
            fontSize = v.replace(/px/g, '')
        }
    }); 
 	......
 	......
    const _canvas = createCanvas(1, 1);
    let context2D = _canvas.getContext("2d"); 
    context2D.font = font;
    context2D.lineJoin = "round";
    context2D.lineWidth = strokeWidth;  
    let fsize = parseInt(fontSize.replace(/px/g, ""));
    let width = fsize * text.length + doublePadding;
    let height = 1.2 * (fsize);
    let x=0;
    let y = height * 0.8;
    _canvas.width = width;
    _canvas.height = height; 
    context2D.font = font;
    context2D.lineJoin = "round";
    context2D.lineWidth = strokeWidth;
    if (backgroundColor !=="#00000000") {
        context2D.fillStyle = backgroundColor ;
        context2D.fillRect(0, 0, _canvas.width, _canvas.height);
    } 
    if (stroke) {
        let strokeColor = options.strokeColor;
        context2D.strokeStyle = strokeColor;
        context2D.strokeText(text, x + padding, y);
    } 
    if (fill) {
        let fillColor =options.fillColor;
        context2D.fillStyle = fillColor;
        context2D.fillText(text, x + padding, y);
    } 
    return _canvas;
}
export default writeTextToCanvas;
### Vue3 和 Node.js 中实现同时上传图片文字 在现代 Web 应用开发中,Vue3 提供了强大的组件化能力以及响应式数据绑定功能,而 Node.js 则作为后端服务处理文件和其他数据的接收与存储。以下是通过 Vue3 前端发送图片文字到 Node.js 后端的具体实现方式。 #### 1. **前端部分 (Vue3)** Vue3 的 `v-model` 可以轻松管理表单输入的数据,同时利用 HTML5 的 `<input type="file">` 来获取用户选择的文件并将其换为 FormData 对象以便提交给服务器。 ```javascript <template> <form @submit.prevent="handleSubmit"> <!-- 文字输入框 --> <label>请输入文字:</label> <input v-model="textData" placeholder="在这里输入文字..." /> <!-- 文件上传控件 --> <label>请选择图片:</label> <input type="file" ref="fileInput" @change="handleFileChange" accept="image/*" /> <!-- 提交按钮 --> <button type="submit">上传</button> </form> </template> <script> import axios from 'axios'; export default { data() { return { textData: '', // 存储用户输入的文字 selectedFile: null, // 存储用户选择的文件对象 }; }, methods: { handleFileChange(event) { this.selectedFile = event.target.files[0]; // 获取选中的第一个文件 }, async handleSubmit() { const formData = new FormData(); // 创建 FormData 实例 formData.append('text', this.textData); // 添加文字字段 formData.append('file', this.selectedFile); // 添加文件字段 try { await axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, // 设置请求头 }); alert('上传成功!'); } catch (error) { console.error(error); alert('上传失败,请重试'); } }, }, }; </script> ``` 上述代码实现了以下逻辑: - 用户可以通过输入框填写文字[^1]。 - 使用 `<input type="file">` 控制器让用户选择一张图片,并监听其变化事件来捕获所选文件[^2]。 - 当点击“上传”按钮时,会创建一个 `FormData` 对象并将文字和文件附加进去,最后通过 Axios 发送到指定 URL `/upload` 处理。 #### 2. **后端部分 (Node.js with Express)** 为了支持多部分内容类型的 POST 请求(即包含文本和二进制文件),推荐使用 Multer 中间件解析 multipart/form-data 格式的 HTTP 请求体。 安装依赖库: ```bash npm install express multer cors body-parser ``` 编写路由处理器如下所示: ```javascript const express = require('express'); const multer = require('multer'); // 解析上传文件中间件 const path = require('path'); // 初始化应用实例 const app = express(); app.use(express.json()); // JSON 数据解析 app.use(cors()); // 跨域资源共享设置 // 配置 Multer 存储选项 const storage = multer.diskStorage({ destination(req, file, cb) { cb(null, './uploads/'); // 定义保存目录 }, filename(req, file, cb) { cb( null, `${Date.now()}-${Math.round(Math.random() * 1e9)}${path.extname(file.originalname)}` ); // 自定义命名规则防止覆盖冲突 }, }); // 初始化 Multer 单文件上传配置 const upload = multer({ storage }); // 图片文字上传接口 app.post('/upload', upload.single('file'), (req, res) => { const uploadedText = req.body.text || ''; // 获取传来的文本参数 const filePath = req.file ? req.file.path : ''; // 如果有则返回路径否则为空字符串 res.status(200).json({ success: true, message: '上传完成', result: { text: uploadedText, imageUrl: filePath.replace(/\\/g, '/').replace(/^\.\/public/, ''), // 返回可访问链接地址 }, }); }); // 开启服务监听端口8080 const PORT = process.env.PORT || 8080; app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`) ); ``` 此脚本完成了这些操作: - 设定了一个简单的 RESTful API 接收来自客户端发过来的内容。 - 使用 Multer 将接收到的图像存放到本地磁盘上的特定位置。 - 把关联的信息打包成 JSON 形式反馈回去告知调用方结果状态及详情信息。 #### 总结说明 以上展示了完整的前后端交互流程,从前端收集必要的资料直到它们被安全可靠地送达目的地为止。值得注意的是,在实际部署过程中还需要考虑安全性因素比如验证身份认证机制、限制允许的最大尺寸大小等等额外措施保障整个系统的稳健运行。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Free2140

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值