Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2009
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Exclamation 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.
Responder Con Cita
  #2  
Antiguo 08-03-2009
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
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.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 09-03-2009
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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;
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #4  
Antiguo 09-03-2009
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
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.
Responder Con Cita
  #5  
Antiguo 09-03-2009
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por MAXIUM Ver Mensaje
...[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 Ver Mensaje
...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.
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #6  
Antiguo 10-03-2009
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
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;
Responder Con Cita
  #7  
Antiguo 10-03-2009
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Y digo yo, ¿no sería más fácil buscar una fuente tipográfica, instalarla y utilizarla? Salvo que estés programando un generador de fuentes tipográficas, claro...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
dibujar texto en un TImage zidfrid C++ Builder 3 17-07-2008 15:05:52
unir puntos con Open GL para armar un contorno(builder C++) BC++ C++ Builder 3 24-06-2008 14:42:14
Contorno de imagen oregon Gráficos 4 23-02-2007 02:35:29
Dibujar línea dicatek Gráficos 8 29-07-2006 16:47:26
TImage con contorno no rectangular Hommer OOP 3 21-05-2003 15:55:46


La franja horaria es GMT +2. Ahora son las 10:21:52.


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
Copyright 1996-2007 Club Delphi