Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Texto de Edit a Image BMP? (https://www.clubdelphi.com/foros/showthread.php?t=88752)

wolfran_hack 27-07-2015 04:39:48

Texto de Edit a Image BMP?
 
Tenemos un Edit que tiene un texto, por ejemplo un numero y necesitamos que ese numero se aplique a un Image o bmp con negrita y demás para ser impreso. Esto es posible?

AgustinOrtu 27-07-2015 04:59:45

Necesitas si o si la imagen? No podes usar un RichEdit?

wolfran_hack 27-07-2015 05:54:43

si tiene que ser una imagen porque el printer de delphi xe no se pasa a multiplataforma y solo logre imprimir bmp

AgustinOrtu 27-07-2015 07:27:18

No soy ningun experto pero proba con esto

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    PaintBox1: TPaintBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // dibujar texto del edit en el paintbox
  PaintBox1.Canvas.Font.Style := [fsBold];
  PaintBox1.Canvas.Font.Name := 'Calibri';
  PaintBox1.Canvas.Font.Size := 190;
  PaintBox1.Color := clWhite;
  PaintBox1.Canvas.Rectangle(0, 0, PaintBox1.Width, PaintBox1.Height);
  PaintBox1.Canvas.TextOut(PaintBox1.Width div 4, 1, Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  FImage: TBitmap;
  FDest, FSource: TRect;
begin
  // guardar la imagen generada
  FImage := TBitmap.Create;
  try
    FImage.Height := PaintBox1.Height;
    FImage.Width := PaintBox1.Width;
    FDest := Rect(0, 0, FImage.Width, FImage.Height);
    FSource := Rect(0, 0, PaintBox1.Width, PaintBox1.Height);
    FImage.Canvas.CopyRect(FDest, PaintBox1.Canvas, FSource);
    // guardar la imagen..
    FImage.SaveToFile('test.bmp');
  finally
    FImage.Free;
  end;
end;

end.

ecfisa 27-07-2015 21:40:18

Hola wolfran_hack.

Otra opción:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Color      := clSilver; // (*)
  Edit1.Font.Name  := 'Segoe Print';
  Edit1.Font.Size  := 12;
  Edit1.Font.Style := Edit1.Font.Style + [fsBold];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  bm : TBitmap;
  cc : TControlCanvas;
  sz : TSize;
begin
  bm := Image1.Picture.Bitmap;
  cc := TControlCanvas.Create;
  try
    cc.control :=  Edit1;
    cc.Font.Assign(Edit1.Font);
    bm.Width  := cc.ClipRect.Right;
    bm.Height := cc.ClipRect.Bottom;
    GetTextExtentPoint32(cc.Handle, PChar(Edit1.Text), Length(Edit1.Text), sz);
    BitBlt(bm.Canvas.Handle, 0, 0, sz.cx, sz.cy, cc.Handle, 0, 0, SRCCOPY);
  finally
    cc.free;
  end;
end;
(*) El color clSilver es a fin de resaltar el área de lo copiado.

Salida:


Saludos :)

wolfran_hack 27-07-2015 22:04:47

@ecfisa: Mil gracias, es exactamente lo que estaba buscando. Le agrego un .Picture Nil para limpiarla y volver a generarla.

Código Delphi [-]
  sz : TSize;
begin
  Image1.Picture := nil;
  bm := Image1.Picture.Bitmap;

Por ahora en Delphi7 funciona, luego probare en el DelphiXE8 haber como funciona.

wolfran_hack 28-07-2015 03:53:20

No en Delphi XE8 no funciona. Encontré que se puede hacer con canvas pero no aparece el texto.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  MyRect: TRectF;
  x1, y1, x2, y2: integer;
begin
  x1 := 60;
  y1 := 60;
  x2 := MainImage.Bitmap.Canvas.Width - 60;
  y2 := MainImage.Bitmap.Canvas.Height - 60;
  MyRect := TRectF.Create(x1, y1, x2, y2);
  // fills and draws the text in the specified rectangle area of the canvas
  MainImage.Bitmap.Canvas.BeginScene;
  MainImage.Bitmap.Canvas.FillText(MyRect, TextEdit.Text, false, 100,[TFillTextFlag.RightToLeft], TTextAlign.Center, TTextAlign.Center);
  MainImage.Bitmap.Canvas.EndScene;
  // updates the bitmap
  //MainImage.Bitmap.BitmapChanged;
end;

wolfran_hack 28-07-2015 04:29:00

Solucionado con

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
  var
    Rect: TRectF;
  begin
    with Image1.Bitmap do
      begin
        SetSize(Trunc(Image1.Width), Trunc(Image1.Height));
        Clear(TAlphaColors.White);
        Canvas.BeginScene();
        Canvas.Fill.Color := TAlphaColors.Black;
        Canvas.Font.Size := 60;
        Rect.Create(0, 0, Trunc(Image1.Width), Trunc(Image1.Height));
        Canvas.FillText(Rect,
                        Edit1.Text,
                        False,
                        100,
                        [],
                        TTextAlign.Center,
                        TTextAlign.Center);
        Canvas.EndScene();
      end;
  end;

ecfisa 28-07-2015 12:51:01

Hola wolfran_hack.

Primero que nada me alegra que hayas encontrado una solución ^\||/

Ignoraba que fuera para aplicar a esa version (y desconozco la misma), pero de tu primer mensaje, había entendido que deseabas reproducir fielmente la fuente del edit.
Y del último código me surge una duda: ¿ De donde o como, logras obtener las propiedades tales como negrita, tamaño, etc. que posee la fuente del TEdit ?

Por ejemplo desconozco la función de la línea:
Código Delphi [-]
Canvas.BeginScene();

Saludos :)

wolfran_hack 28-07-2015 17:33:52

El TCanvas, es para básicamente dibujar, esta en otros lenguajes como CSS y Java, el BeginScene es para comenzar a dibujar y el EndScene indica que termino el dibujo. De igual manera se puede cambiar la fuente, color, tamaño, etc.

Casimiro Notevi 28-07-2015 18:02:48

¿Eso es el Canvas estandar de delphi?

ecfisa 28-07-2015 19:18:30

Hola wolfran_hack.

Si si, obviamente entiendo el cometido de TCanvas, es sólo que ignoraba la funcionalidad de BeginScene y EndScene gracias por la aclaración.
Entonces sigo sin explicarme como obtenes los valores de la propiedad Font del TEdit, da la impresión que son asignados de forma arbitraria.

¿ Estas usando VCL ?

Saludos :)

Delphius 28-07-2015 21:34:35

BeginEscene y EndEscene proviene desde alguna edición XE. Posiblemente desde la XE5. Para los demás que estan con ediciones anteriores es totalmente natural desconocerlo.

Ya es hora de que cuando se pida asesoría se indique la versión de Delphi ¿no creen?. Ya es mayúscula la diferencia entre las ediciones XE5+ y las D7- En lo ques gráfica por sobre todo, con la llegada de FMX los cambios se multiplicaron.

AgustinOrtu 28-07-2015 21:42:13

Por como usa los enumerativos todo parece indicar que es FireMonkey

Código Delphi [-]
TAlphaColors.White  --> en VCL clWhite
TAlphaColors.Black  --> en VCL clBlack
TTextAlign.Center    --> en VCL alCenter
TTextAlign.Center

No solo indicar version de Delphi, sino tambien diferenciar en FMX y VCL, son dos framework que cada dia son mas diferentes

ecfisa 28-07-2015 21:53:17

Hola wolfran_hack.

Toma en cuenta estas útiles sugerencias:
Cita:

Empezado por Delphius (Mensaje 494960)
...
Ya es hora de que cuando se pida asesoría se indique la versión de Delphi ¿no creen?. Ya es mayúscula la diferencia entre las ediciones XE5+ y las D7- En lo ques gráfica por sobre todo, con la llegada de FMX los cambios se multiplicaron.

Cita:

Empezado por AgustinOrtu (Mensaje 494962)
Por como usa los enumerativos todo parece indicar que es FireMonkey
...
No solo indicar version de Delphi, sino tambien diferenciar en FMX y VCL, son dos framework que cada dia son mas diferentes

Y además existe un foro dedicado a FireMonkey, motivo por el cuál he movido este hilo al mismo.

Saludos y gracias por tu colaboración :)

wolfran_hack 28-07-2015 22:55:51

Cita:

Empezado por Delphius (Mensaje 494960)
BeginEscene y EndEscene proviene desde alguna edición XE. Posiblemente desde la XE5. Para los demás que estan con ediciones anteriores es totalmente natural desconocerlo.

Ya es hora de que cuando se pida asesoría se indique la versión de Delphi ¿no creen?. Ya es mayúscula la diferencia entre las ediciones XE5+ y las D7- En lo ques gráfica por sobre todo, con la llegada de FMX los cambios se multiplicaron.

Principalmente lo quería hacer en Delphi 7, por este motivo lo coloque en Gráficos, luego como funciono quice pasarlo a Delphi XE8, por eso no indique que versión era, de igual manera la información que aportaron fue muy útil. Aunque no se porque TImage se ve pequeño y no respeta tamaños en Android.


La franja horaria es GMT +2. Ahora son las 04:25:23.

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