【问题标题】:How to create a captcha verification in delphi 2010?如何在delphi 2010中创建验证码?
【发布时间】:2023-03-20 17:57:01
【问题描述】:

正如标题所要求的那样 - 我现在想知道我是否可以在我的注册表单中使用验证码(使用 delphi 2010)

【问题讨论】:

  • 你显然需要在服务器端生成验证码。我强烈建议不要自己创建验证码,而是寻找嵌入现有验证码的方法,例如重新验证码。
  • 它是服务器端应用程序(如网络应用程序)还是客户端/服务器应用程序?

标签: delphi delphi-2010 captcha


【解决方案1】:

使用 Image 控件并绘制不同的元素来获取 Captcha。 您可以使用如下代码绘制一些字母:

procedure TForm1.letrasAnguladas(c : string; angulo : integer; nextPos : Integer);
var
   logfont:TLogFont;
   font: Thandle;
begin
   LogFont.lfheight:=30;
   logfont.lfwidth:=10;
   logfont.lfweight:=900;

   LogFont.lfEscapement:=angulo;
   logfont.lfcharset:=1;
   logfont.lfoutprecision:=OUT_TT_ONLY_PRECIS;
   logfont.lfquality:= DEFAULT_QUALITY;
   logfont.lfpitchandfamily:= FF_SWISS;
   logfont.lfUnderline := 0;
   logfont.lfStrikeOut := 0;

   font:=createfontindirect(logfont);

   Selectobject(Image1.canvas.handle,font);

   SetTextColor(Image1.canvas.handle,rgb(0,180,0));
   SetBKmode(Image1.canvas.handle,transparent);

   Image1.canvas.textout(nextPos,Image1.Height div 3,c);
   SetTextColor(Image1.canvas.handle,rgb(Random(255),Random(255),Random(255)));
   deleteobject(font);
end;

你可以这样使用它:

   for vX := 1 to Length(strCaptcha) do
      letrasAnguladas(strCaptcha[vX],Random(600)+1,25*vX-15);

最后,您可以使用类似以下的代码在验证码中添加一些行:

  for i := 0 to 15 do begin
    Image1.Canvas.Pen.Color := Random(100000);
    Image1.Canvas.MoveTo(random(Image1.Width), random(Image1.Height));
    Image1.Canvas.LineTo(random(Image1.Width), random(Image1.Height));
  end;

更改参数并尝试其他修改结果。 您可以像这样获取一些图像:

问候。

【讨论】:

  • 这段代码运行良好,除了一个小错误:TextOut 的行和 SetTextColor 的行必须颠倒,以便每个字母有效地以不同的颜色绘制。
【解决方案2】:

Captcha 它只是一个带有一些文字的图形。所以,你可以制作一个图像,并输出一些 上面的文字。如果您需要更多信息,那么您需要更全面地描述 制作一个你不懂的验证码是什么意思。

也许您可以在数据库表中保留所有可能单词的列表,然后通过 将单词的 id 号添加到您的验证码函数中。这样你就有办法了 知道用户是否输入了正确的单词并根据需要进行补充检查。

这里有如何在图像上绘制透明文本:

Writing Transparent Text on Image

而且网上有很多例子。

或者,您可以使用组件为您完成工作。

【讨论】:

    【解决方案3】:

    也许你可以调用 Google recaptcha api。

    【讨论】:

      【解决方案4】:

      适用于 maXbox 中的倒线:

       procedure TForm1letrasAnguladas(c : string; angulo : integer; 
                                       nextPos : Integer; image1: TImage);
       var logfont:TLogFont;
           font: Thandle;
          //Image1: TImage;
          //form: TForm;
       begin
      
         LogFont.lfheight:=45;
         logfont.lfwidth:=10;
         logfont.lfweight:=900;
      
         LogFont.lfEscapement:=angulo;
         logfont.lfcharset:=1;
         logfont.lfoutprecision:=OUT_TT_ONLY_PRECIS;
         logfont.lfquality:= DEFAULT_QUALITY;
         logfont.lfpitchandfamily:= FF_SWISS;
         logfont.lfUnderline := 0;
         logfont.lfStrikeOut := 0;
         font:=createfontindirect(logfont);
      
         Selectobject(Image1.canvas.handle,font);
         SetTextColor(Image1.canvas.handle,rgb(0,180,0));
         SetBKmode(Image1.canvas.handle,TRansparent);
         SetTextColor(Image1.canvas.handle,rgb(Random(255),Random(255),Random(255)));
         Image1.canvas.textout(nextPos,Image1.Height div 3,c);
        //SetTextColor(Image1.canvas.handle,rgb(Random(255),Random(255),Random(255)));
        deleteobject(font);
      end;
      
      form1:= TForm.create(self);
      image1:= TImage.create(self);
      with form1 do begin
       setbounds(100,100, 300,250)
       show;
       with image1 do begin
         parent:= form1;
         setbounds(0,0,300,220)
         for it := 0 to 15 do begin
           Canvas.Pen.Color := Random(100000);
           Canvas.MoveTo(random(Width), random(Height));
           Canvas.LineTo(random(Width), random(Height));
         end;
        end;  
       end;
       
      
      strCaptcha:= 'str-Captcha'
      for vX := 1 to Length(strCaptcha) do
        TForm1letrasAnguladas(strCaptcha[vX],Random(600)+1,25*vX-15, image1);
      

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2011-07-02
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多