Ir al contenido


Foto

Captcha + uniGUI


  • Por favor identifícate para responder
1 respuesta en este tema

#1 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 27 abril 2012 - 11:42

Había estado leyendo varios post en el foro Oficial de uniGUI a cerca de los captcha, había varias funciones propuesta, me decidí a unir algunas funciones propuestas además de modificar algunas otras y al final solo es necesario tener esto para hacerlo funcional:



delphi
  1. Procedure Distort(aBitmap: TBitmap);
  2. var
  3.   b : TBitmap;
  4.   x,y : integer;
  5. begin
  6.   b := TBitmap.Create;
  7.   b.Width  := aBitmap.Width;
  8.   b.Height := aBitmap.Height;
  9.   for x := 0 to aBitmap.Canvas.ClipRect.Right do
  10.   begin
  11.     for y := 0 to aBitmap.Canvas.ClipRect.Bottom do
  12.     begin
  13.       b.Canvas.Pixels[x,y +trunc(sin(x/4)*3)] :=
  14.         aBitmap.Canvas.Pixels[x,y];
  15.     end;
  16.   end;
  17.   aBitmap.Assign(b);
  18.   b.Free;
  19. end;
  20.  
  21. procedure letrasAnguladas(c : string; angulo : integer; nextPos : Integer; Image1: TBitmap);
  22. var
  23.   logfont:TLogFont;
  24.   font: Thandle;
  25. begin
  26.   LogFont.lfheight:=25;
  27.   logfont.lfwidth:=12;
  28.   logfont.lfweight:=800;
  29.  
  30.   LogFont.lfEscapement:=angulo;
  31.   logfont.lfcharset:= ANSI_CHARSET;
  32.   logfont.lfoutprecision:= OUT_TT_ONLY_PRECIS;
  33.   logfont.lfquality:= CLEARTYPE_QUALITY;
  34.   logfont.lfpitchandfamily:= FF_SWISS;
  35.   logfont.lfUnderline := 0;
  36.   logfont.lfStrikeOut := 1;
  37.  
  38.   font:=createfontindirect(logfont);
  39.  
  40.   Selectobject(Image1.canvas.handle,font);
  41.  
  42.   SetTextColor(Image1.canvas.handle,rgb(Random(200),Random(200),Random(200)));
  43.   Image1.canvas.textout(nextPos,6,c);
  44.  
  45.   deleteobject(font);
  46. end;
  47.  
  48. function PalabraAleatoria(Longitud: integer): string;
  49. const
  50.   Letras = 'abcdefghjkmnopqrstuvwxyz/01234567890ABCDEFGHIJKLMNOPRSTUVWXYZ%?¿';
  51. var
  52.   n  : integer;
  53. begin
  54.   Result:='';
  55.   for n:=1 to Longitud do
  56.     Result:=Result + Letras[1 + Random(Length(Letras))];
  57. end;
  58.  
  59. procedure TMainForm.generaImg();
  60. var
  61.   vX : integer;
  62.   Image1: TBitmap;
  63. begin
  64.   Randomize;
  65.   Image1 := TBitmap.Create;
  66.   with Image1 do
  67.   begin
  68.     Image1.Width  := 240;
  69.     Image1.height := 80;
  70.   end;
  71.  
  72.   palabra := PalabraAleatoria(Random(6)+5);
  73.   if length(palabra) > 6 then
  74.       palabra := copy(palabra,1,6);
  75.   for vX := 1 to Length(palabra) do
  76.       letrasAnguladas(palabra[vX],Random(200)+1,25*vX-15,Image1);
  77.   distort(Image1);
  78.   MainForm.UniImage1.Picture.Bitmap := Image1;
  79.   Image1.Free;
  80. end;
  81.  
  82. procedure TMainForm.UniBitBtn1Click(Sender: TObject);
  83. begin
  84.   generaImg;
  85. end;
  86.  
  87. procedure TMainForm.UniButton1Click(Sender: TObject);
  88. begin
  89. //Validado la palabra generada vs palabra ingresada por el usuario
  90.   if UpperCase(palabra) = Uppercase(uniEdit1.Text) then
  91.     Showmessage('Correcto!')
  92.   else
  93.     Showmessage('Incorrecto, vuelve a intentar');
  94. end;



Al final un par de procedimientos y una comparación común y corriente, basta para tener nuestro captcha funcionando. Adjunto el proyecto.

Espero les sea de utilidad.

Saludos

Archivos adjuntos


  • 0

#2 estor485

estor485

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 25 mayo 2012 - 02:58

Muy buena la aplicación, solamente me marco un error con la linea

delphi
  1. logfont.lfquality:= CLEARTYPE_QUALITY;

pero por lo que leí es para Windows XP (si mal no entendí) y al comentarla a corrido sin problemas, gracias por el aporte  (y).
  • 0




IP.Board spam blocked by CleanTalk.