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);

以上代码哪地方出错了。

7 回复

当然可以。Node.js 使用 gm 库(一个基于 ImageMagick 的库)来处理图像,包括生成验证码。以下是一个使用 gm 库生成简单验证码的示例代码。

示例代码

首先确保你已经安装了 gmimageMagick

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);

代码解析

  1. 引入必要的模块:

    • gm 是用于图像处理的库。
    • fs 是文件系统模块,用于写入文件。
  2. 定义验证码字符集和长度:

    • characters 是包含所有可能字符的字符串。
    • captchaLength 定义验证码的长度。
  3. 生成随机验证码字符串:

    • generateCaptcha 函数通过从字符集中随机选择字符来生成验证码字符串。
  4. 生成验证码图片:

    • generateImage 函数使用 gm 创建一个指定宽度和高度的空白图片。
    • 使用 drawText 方法将验证码文本绘制到图片上,并保存为 captcha.png 文件。
  5. 主程序:

    • 调用 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 方法在图像上绘制文本。
  • 最后将生成的图片保存到指定路径。

注意:

  1. 确保你已经安装了 gm 库 (npm install gm) 和 ImageMagick(Mac OS 上可以使用 Homebrew 安装:brew install imagemagick)。
  2. 验证码的复杂性可以根据需要增加,例如添加随机颜色、旋转角度、噪声等。

这样你可以创建一个简单的验证码图片。

回到顶部