PDA

Ver la Versión Completa : Texto de Edit a Image BMP?


wolfran_hack
27-07-2015, 04:39:48
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


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:

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:
http://sia1.subirimagenes.net/img/2015/07/27/150727092423804322.png

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.

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.

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

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:
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


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:
...
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.
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 (http://www.clubdelphi.com/foros/forumdisplay.php?f=50), 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
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 (http://www.clubdelphi.com/foros/showthread.php?t=88759).