Nodejs 有没有采用gm生成验证码的例子?
Nodejs 有没有采用gm生成验证码的例子?
在mac os 下测试没有成功: var gm = require(“gm”); var imageMagick = gm.subClass({ imageMagick : true });
imageMagick(224, 144, “#fff”) .fontSize(18) .drawText(10, 25, “GMagick!”) .write(’./ImgNumber.png’,callback);
以上代码哪地方出错了。
当然可以。Node.js 使用 gm
库(一个基于 ImageMagick 的库)来处理图像,包括生成验证码。以下是一个使用 gm
库生成简单验证码的示例代码。
示例代码
首先确保你已经安装了 gm
和 imageMagick
:
npm install gm
然后你可以使用以下代码生成验证码:
const gm = require('gm').subClass({ imageMagick: true });
const fs = require('fs');
// 定义验证码的字符集
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const captchaLength = 6;
// 随机生成验证码字符串
function generateCaptcha() {
let captcha = '';
for (let i = 0; i < captchaLength; i++) {
captcha += characters.charAt(Math.floor(Math.random() * characters.length));
}
return captcha;
}
// 生成验证码图片
function generateImage(captcha) {
const width = 200;
const height = 50;
// 创建空白图片
gm(width, height, '#ffffff')
.fontSize(36)
.gravity('Center')
.drawText(0, 0, captcha, 'West')
.write('./captcha.png', function(err) {
if (err) throw err;
console.log(`验证码已生成: ${captcha}`);
});
}
// 主程序
const captcha = generateCaptcha();
generateImage(captcha);
代码解析
-
引入必要的模块:
gm
是用于图像处理的库。fs
是文件系统模块,用于写入文件。
-
定义验证码字符集和长度:
characters
是包含所有可能字符的字符串。captchaLength
定义验证码的长度。
-
生成随机验证码字符串:
generateCaptcha
函数通过从字符集中随机选择字符来生成验证码字符串。
-
生成验证码图片:
generateImage
函数使用gm
创建一个指定宽度和高度的空白图片。- 使用
drawText
方法将验证码文本绘制到图片上,并保存为captcha.png
文件。
-
主程序:
- 调用
generateCaptcha
生成验证码字符串。 - 调用
generateImage
将验证码字符串转换为图片。
- 调用
注意事项
- 确保你已经在你的系统中安装了 ImageMagick。如果没有安装,可以通过以下命令安装:
brew install imagemagick # macOS
sudo apt-get install imagemagick # Ubuntu/Debian
- 如果你在 Mac OS 下遇到问题,请检查是否正确配置了 ImageMagick 环境变量。
希望这能帮助你生成验证码!
var gm = require("gm");
var imageMagick = gm.subClass({ imageMagick : true });
imageMagick(224, 144, "#fff")
.fontSize(18)
.drawText(10, 25, "GMagick!")
.write('./ImgNumber.png',function(){}); // bug point
签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3
不行,callback是我传进来的。 问题不是出在这 mac-mrlongtekiMac-mini:test mac-mrlong$ convert b.jpg -gravity southeast -fill black -pointsize 16 -draw “text 5,5 ‘www.yunzj.net’” c.jpg
convert: delegate library support not built-in none' (Freetype) @ warning/annotate.c/RenderFreetype/1533. convert: Postscript delegate failed
/var/tmp/magick-23599rP_TuIqCrXdh’: No such file or directory @ error/ps.c/ReadPSImage/837.
convert: delegate library support not built-in none' (Freetype) @ warning/annotate.c/RenderFreetype/1533. convert: Postscript delegate failed
/var/tmp/magick-23599xTb_YBMQEKy6’: No such file or directory @ error/ps.c/ReadPSImage/837.
convert: non-conforming drawing primitive definition `text’ @ error/draw.c/DrawImage/3168.
I use this lib https://github.com/aheckmann/gm
win / mac / ubuntu is OK.
签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3
原因找到, 没有安装Ghostscript, brew install ghostscript 就行了。 以前一直用 sudo port install ghostscript 安装很慢。太累了。
贴出代码,希望大家一起用过gm
// //生成验证码 // //直接生成一个图片到前台 // Gm.ImgNumber(‘23143’,function(err,stdout){} // if(!err){stdout.pipe(res)} // ); //
exports.ImgNumber=function(text,callback){ var img=imageMagick(214, 44, “#fff”) .fill("#fff") .stroke(“black”, 1) .drawRectangle(2, 2, 210, 40) .autoOrient();
var imgcolor=[“green”,“blue”,“black”,“red”]; for (var i=0;i<20;i++){ img.stroke(imgcolor[parseInt(Math.random()*4)], 1); img.drawLine( parseInt(Math.random()*210+1), parseInt(Math.random()*40+1), parseInt(Math.random()*210+1), parseInt(Math.random()*40+1)); };
img.fontSize(30);
img.stroke("#ffffff");
for (var i=0;i<text.length;i++)
{
img.stroke(imgcolor[parseInt(Math.random()4)], 1);
img.drawText(20+i30, 30, text[i]);
};
var filename = ‘./in’ + text + ‘.jpg’;
img.write(filename,function(err){
if(!err){
var readStream = fs.createReadStream(filename,{flags : ‘r’,
encoding : null,
mode : 0666,
autoClose: true
});
callback(err,readStream);
fs.unlink(filename);
}
else{
callback(err);
};
});
//img.stream(callback);
//img.toBuffer(callback);
//.write(writeStream, function (err) { // if (!err) console.log(’ hooray! '); //}); }
Node.js 中使用 gm
库生成验证码是一种常见的方式。你提供的代码片段中有一些问题,比如引号的使用不正确以及文件路径中的字符转义问题。
下面是正确的使用 gm
库生成验证码的示例代码:
const gm = require('gm').subClass({ imageMagick: true });
const fs = require('fs');
// 创建一个空白图片,并在其上绘制验证码文字
gm(224, 144, '#fff')
.fontSize(18)
.gravity('West') // 设置文字绘制的起点为左对齐
.drawText(10, 25, 'GMagick!', function(err) {
if (err) throw err;
this.toBuffer('PNG', (err, buffer) => {
if (err) throw err;
fs.writeFileSync('./ImgNumber.png', buffer);
console.log('验证码图片已生成');
});
});
在这个例子中:
- 使用了
gm.subClass
来确保 ImageMagick 被正确加载。 - 通过
drawText
方法在图像上绘制文本。 - 最后将生成的图片保存到指定路径。
注意:
- 确保你已经安装了
gm
库 (npm install gm
) 和 ImageMagick(Mac OS 上可以使用 Homebrew 安装:brew install imagemagick
)。 - 验证码的复杂性可以根据需要增加,例如添加随机颜色、旋转角度、噪声等。
这样你可以创建一个简单的验证码图片。