Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Dibujar contorno de Texto (https://www.clubdelphi.com/foros/showthread.php?t=63905)

MAXIUM 08-03-2009 23:06:08

Dibujar contorno de Texto
 


Hola, como puedo lograr dibujar el contorno de un texto tal como la imagen que he colocado, si es posible usando el canvas. De ante mano muchas gracias.

DarkMan 08-03-2009 23:58:39

Bueno, en realidad no es una tarea muy compleja. Para esto necesitas tener dos mapas de bits, uno temporal y otro que contenga el texto original, ambos del mismo tamaño y características.

Partiendo del mapa de bits original con X*Y pixeles, lo que tienes que hacer es ir recorriendo pixel por pixel y a la vez sus alrededores:
Código:


  P1 P2 P3
  P4 P5 P6
  P7 P8 P9

Si sabes que todos los pixeles que no forman parte del texto son de un color determinado, sólo tendrías que verificar si en algún punto alrededor de P5 el píxel tiene el color del texto. De ser así coloreas P5 en el mapa de bits temporal del color de borde que desees (usando dos mapas de bits evitas que al dibujar sobre el que estas analizando alteres el mismo proceso de análisis).

Básicamente el concepto es ese, quizás alguien te saque alguna función ya existente de windows que se encargue de realizar eso, pero yo tuve el mismo problema y la solución fue crear una función que realizase esto mismo.

La forma sencilla de hacerlo es utilizar la propiedad canvas.pixels, pero para textos largos resulta muy lento. La forma mas compleja es usar canvas.scanline, te llevará más tiempo comprender como funciona y como aplicarlo, pero el rendimiento aumenta considerablemente.

Un saludo y espero que lo hayas entendido.

cHackAll 09-03-2009 00:43:15

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 with Canvas do
  begin
   Font.Size := 66;
   Brush.Style := bsClear;
   BeginPath(Handle);
   TextOut(66, 66, 'cHackAll');
   EndPath(Handle);
//   Brush.Color := clRed;
//   Brush.Style := bsSolid;
   StrokeAndFillPath(Handle)
  end;
end;

MAXIUM 09-03-2009 01:27:28

Muchas gracias a ambos, pero [cHackAll], solo sale tu nombre en grande y pixeleado. Podrias enviarme el proyecto completo ya que ami no me resulta.

cHackAll 09-03-2009 22:18:44

Cita:

Empezado por MAXIUM (Mensaje 340604)
...[cHackAll], solo sale tu nombre en grande y pixeleado...

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 with Canvas do
  begin
   Font.Size := 66;
   Brush.Style := bsClear;
   BeginPath(Handle);
   TextOut(0, 0, 'Hola');
   EndPath(Handle);
   Brush.Color := clWhite;
   StrokeAndFillPath(Handle)
  end;
end;


Cita:

Empezado por MAXIUM (Mensaje 340604)
...Podrias enviarme el proyecto completo ya que ami no me resulta...

No hay proyeco completo, creas uno nuevo le agregas un boton y pegas el anterior codigo.

MAXIUM 10-03-2009 02:17:07

Definitivamente tu código no me funciona, pero este si, lo estoy estudiando y funciona de maravillas.

Código Delphi [-]
var HFnt: HFONT; Fontname, Txt: PChar; sze: Size;
begin
  Fontname := 'Arial';
  txt := '[cHackAll]';
  HFnt := CreateFont(90, 60, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
    PROOF_QUALITY, DEFAULT_PITCH + FF_DONTCARE, Fontname);

  SelectObject(Canvas.Handle, hfnt);
  SetBkMode(Canvas.Handle, TRANSPARENT);
  GetTextExtentPoint32(Canvas.Handle, txt, length(txt), sze);
  BeginPath(Canvas.Handle);

  TextOut(Canvas.Handle, 0, 0, Txt, length(Txt));

  EndPath(Canvas.Handle);

  StrokePath(Canvas.Handle);
  SetBkMode(Canvas.Handle, OPAQUE);


  DeleteObject(SelectObject(Canvas.Handle, GetStockObject(WHITE_BRUSH)));
  SelectObject(Canvas.Handle, GetStockObject(SYSTEM_FONT));
  DeleteObject(HFnt);

end;

Ñuño Martínez 10-03-2009 09:45:50

Y digo yo, ¿no sería más fácil buscar una fuente tipográfica, instalarla y utilizarla?:confused: Salvo que estés programando un generador de fuentes tipográficas, claro...


La franja horaria es GMT +2. Ahora son las 06:54:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi