$("#img-code").bind( 'click', function () {
$(this).attr('src','VerifyCode?t='+Math.random());
});

unit uVerifyCode;

interface

uses System.Classes, System.SysUtils, FMX.Types, FMX.Objects, FMX.Graphics,
System.UIConsts, System.UITypes,
{$IFDEF MSWINDOWS}ActiveX, {$ENDIF MSWINDOWS}
System.Types; type
// 生成验证码组件
TGenerateVerifyCode = class
private const
// 定义字典表,不要零(0),因为零和字母O样子太接近
arrStr: array [ .. ] of char = (
'','','','','','','','','',
'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z');
private
FBitmapWidth: integer; // 图片宽度
FBitmapHeight: integer; // 图片高度
FCodeCount: integer; // 取验证码字符的个数,默认是4个字符
FFontName: string; // 字体名称
FMinFontSize: integer; // 最小字体大小
FRandomLineCount: integer; // 背景随机线条数
FTransparency: byte; // 背景随机线条的透明度
FXRandomLen: integer; // X的随机值长度
FYRandomLen: integer; // Y的随机值长度
// 画出验证码函数
function VerifyCodeDrawImg(Img: TImage): string;
public
constructor Create();
procedure GetVerifyCodeAndImage(ImageStream: TStream;
var VerifyCode: string);
published
property Width: integer read FBitmapWidth write FBitmapWidth;
property Height: integer read FBitmapHeight write FBitmapHeight;
property CodeCount: integer read FCodeCount write FCodeCount;
property FontName: string read FFontName write FFontName;
property MinFontSize: integer read FMinFontSize write FMinFontSize;
property RandomLineCount: integer read FRandomLineCount
write FRandomLineCount;
property Transparency: byte read FTransparency write FTransparency;
property XRandomLen: integer read FXRandomLen write FXRandomLen;
property YRandomLen: integer read FYRandomLen write FYRandomLen;
end; implementation constructor TGenerateVerifyCode.Create();
begin
inherited;
FBitmapWidth := ;
FBitmapHeight := ;
FCodeCount := ;
FFontName := '宋体';
FMinFontSize := ;
FRandomLineCount := ;
FTransparency := ;
FXRandomLen := ;
FYRandomLen := ;
end; // 获取验证码和影像的流数据
procedure TGenerateVerifyCode.GetVerifyCodeAndImage(ImageStream: TStream;
var VerifyCode: string);
var
Img: FMX.Objects.TImage;
begin
{$IFDEF MSWINDOWS}CoInitialize(nil); {$ENDIF MSWINDOWS}
Img := FMX.Objects.TImage.Create(nil);
try
Img.Bitmap := FMX.Graphics.TBitmap.Create(FBitmapWidth, FBitmapHeight);
// 宽100,高40
Img.Bitmap.Canvas.BeginScene;
VerifyCode := VerifyCodeDrawImg(Img);
Img.Bitmap.Canvas.EndScene;
Img.Bitmap.SaveToStream(ImageStream); // 写到流中
finally
freeandnil(Img);
end;
end; // 画出验证码函数
function TGenerateVerifyCode.VerifyCodeDrawImg(Img: TImage): string;
var
I, j, k: integer;
X, Y, W, H: Single;
vLeft: Single;
strResult: RawByteString;
begin
// 只取4个字符
For j := to FCodeCount do
begin
Randomize;
k := Random() mod ;
strResult := strResult + trim(arrStr[k]);
end;
vLeft := ;
Img.Bitmap.Canvas.Font.Family := FFontName;
for j := to FRandomLineCount do // 随机画100条线
begin
Randomize;
Img.Bitmap.Canvas.Stroke.Color := MakeColor(Random() and $C0,
Random() and $C0, Random() and $C0, FTransparency);
Img.Bitmap.Canvas.DrawLine(pointf(Random(), Random()),
pointf(Random(), Random()), );
end;
// 随机字体颜色,这里暂时不用每个字符一个随机颜色
Img.Bitmap.Canvas.Fill.Color := MakeColor((Random() and $C0),
(Random() and $C0), (Random() and $C0));
// 背景色反色
Img.Bitmap.Clear(Img.Bitmap.Canvas.Fill.Color xor $FFFFFF);
for I := to length(strResult) do
begin
Randomize;
// 字体大小
Img.Bitmap.Canvas.Font.Size := Random() + FMinFontSize;
if Img.Bitmap.Canvas.Font.Size < (FMinFontSize + ) then
Img.Bitmap.Canvas.Font.Size := Img.Bitmap.Canvas.Font.Size + ;
if Random() = then
Img.Bitmap.Canvas.Font.Style := [TFontStyle.fsBold]
else
Img.Bitmap.Canvas.Font.Style := [TFontStyle.fsItalic];
begin
X := Random(FXRandomLen) + vLeft;
Y := Random(FYRandomLen);
W := Img.Bitmap.Canvas.TextWidth(strResult[I]);
H := Img.Bitmap.Canvas.TextHeight(strResult[I]);
Img.Bitmap.Canvas.FillText(TRectF.Create(X, Y, X + W, Y + H),
strResult[I], false, , [], TTextAlign.taCenter, TTextAlign.taCenter);
vLeft := X + W + ;
end;
end;
Result := strResult; // 返回值
end; end.

使用方法:

C/S与B/S共同创建方法

var
FGenerateVerifyCode: TGenerateVerifyCode;
begin
FGenerateVerifyCode := TGenerateVerifyCode.Create;
end;

一、C/S使用方法:

procedure TForm1.Button1Click(Sender: TObject);
var
ImageStream: TMemoryStream;
VerifyCode: string;
begin
ImageStream:= TMemoryStream.Create;
try
GetVerifyCodeAndImage(ImageStream, VerifyCode);
Label1.Text:=VerifyCode;
ImageStream.Position:=;
Image1.Bitmap.LoadFromStream(ImageStream);
finally
ImageStream.Free;
end;
end;

二、B/S使用方法:

1、HTML中加入Img元素

<img src="VerifyCode" id="img-code" class="Verify-Code" style="cursor:pointer" alt="验证码" title="看不清楚?点一下图片刷新">

2、JS代码

$("#img-code").bind( 'click', function () {
$(this).attr('src','VerifyCode?t='+Math.random());
});

3、服务端代码

// 获取验证码图片
function TSystemPagePlugin.Method_VerifyCode(Request: TWebRequest;
Response: TWebResponse): boolean;
VAR
VerifyCode: string;
begin
Response.ContentStream := TMemoryStream.Create;
Response.ContentType := 'application/binary;';
// 获取验证码图片和数值
GetVerifyCodeAndImage(Response.ContentStream, VerifyCode);
result := true; ---------------------
作者:晴空无彩虹
来源:CSDN
原文:https://blog.csdn.net/u011784006/article/details/80827181
版权声明:本文为博主原创文章,转载请附上博文链接!

DelphiXE10.2.3——跨平台生成验证码图片的更多相关文章

  1. 【转】DelphiXE10.2.3——跨平台生成验证码图片

    原文地址 Java.PHP.C#等很容易在网上找到生成验证码图片的代码,Delphi却寥寥无几,昨天花了一整天时间,做了个跨平台的验证码,可以用在C/S和B/S端,支持Windows.Linux.An ...

  2. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  3. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  4. Java 生成验证码图片

    生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...

  5. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  6. 012. asp.net生成验证码图片(汉字示例/字母+数字)

    protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...

  7. J2EE如何生成验证码图片和点击刷新验证码

    验证码图片生成步骤 创建BufferedImage对象. 获取BufferedImage的画笔,即调用getGraphics()方法获取Graphics对象. 调用Graphics对象的setColo ...

  8. java web 学习九(通过servlet生成验证码图片)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  9. java web,生成验证码图片的技术

    偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...

随机推荐

  1. input控制输入保留一位小数

    function zlip(obj){ obj.value = obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符 obj.val ...

  2. 100-days: twenty-four

    Title: No word of a lie: scientists rate(评出) the world's biggest peddlers of bull(说瞎话的人,扯淡的人) bullsh ...

  3. Hillstone设备管理-恢复出厂设置

    1.CLI命令行操作 unset all: 根据提示选择是否保存当前配置y/n: 选择是否重启y/n: 系统重启后即恢复到出厂设置. 2.webUI操作 “系统”—“配置”,点击“清除”按钮,系统会提 ...

  4. Spring Boot HikariCP 一 ——集成多数据源

    其实这里介绍的东西主要是参考的另外一篇文章,数据库读写分离的. 参考文章就把链接贴出来,里面有那位的代码,简单明了https://gitee.com/comven/dynamic-datasource ...

  5. json转换对象中出现null属性的解决方法

    前言:当数据进行json转换时,当属性值为null时,json解析就会中断,导致接下来的数据无法正确获取.原则上来讲服务器端发送的json字符串不允许存在属性值为空的情况,但是如果服务器端发送了nul ...

  6. PIL库学习及运用

    了解PIL以及安装. 个方面的功能: (1) 图像归档:对图像进行批处理.生产图像预览.图像格式转换等. (2) 图像处理:图像基本处理.像素处理.颜色处理等. 安装PIL在cmd中输入 pip in ...

  7. 百度地图缩小后marker点的图标移动

    遇到的坑:使用百度地图,当地图缩小时,marker点的自定义图标会出现偏移的问题,marker点的信息窗口会出现闪烁问题. 原因:1.anchor是定位点距离图片左上角的偏移量.如果不给anchor的 ...

  8. $.ajax()参数详解

    来自于<锋利的jQuery(第2版)>. 参数 类型 说明 accepts Map 内容类型发送请求头,告诉服务器什么样的响应会接受返回. 如果accepts设置需要修改,推荐在$.aja ...

  9. JavaSE基础知识(5)—面向对象(抽象类和接口)

    一.抽象类 1.理解 用abstract关键字定义的类,称为抽象类用abstract关键字定义的方法,称为抽象方法意义:当设计父类时,发现该父类根本不需要创建对象,并且里面有不好描述的方法.这个时候往 ...

  10. Ansible安装及OS规划

    Ansible安装  1.以管理用户mtnsadmin连接服务器后下载安装包(-O表示将下载的文件存放到指定的文件夹下,同时重命名下载的文件)     sudo wget -O /etc/yum.re ...