Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Asignar el contenido de un datafield de tipo tbitmap a un objeto gráfico Tpath (https://www.clubdelphi.com/foros/showthread.php?t=96209)

david.camaleon 24-04-2023 19:11:48

Asignar el contenido de un datafield de tipo tbitmap a un objeto gráfico Tpath
 
Buenas tardes,

Lo que trato de hacer es asignar el contenido de un gráfico, en este caso una firma, que cargo desde un TFDQuery a un objeto Tpath.

El paso inverso, es decir pasar del Tpath al Blodfield lo tengo solucionado y funcionando sin problemas.

He estado googleando y no consigo encontrar una solución.

Muchas gracias.

duilioisola 24-04-2023 20:22:10

En principio es la inversa de que lo que te han contestado para cargar.

Código Delphi [-]
  img := Tbitmap.Create(Trunc(Firma.Width), Trunc(Firma.Height));
  try
    img.Canvas.BeginScene;
    try
      firma.PaintTo(img.Canvas, firma.LocalRect);
    finally
      img.Canvas.EndScene;
    end;
    m := TmemoryStream.Create;
    try
      Dataset.close;     
      Dataset.open;     
      Dataset.CampoFIRMA.SavetoStream(m);
      img.LoadFromStream(m);
    finally
      FreeAndNil(m);
    end;
  finally
    FreeAndNil(img);
  end;

Neftali [Germán.Estévez] 25-04-2023 09:10:08

Cita:

Empezado por david.camaleon (Mensaje 551278)
Lo que trato de hacer es asignar el contenido de un gráfico, en este caso una firma, que cargo desde un TFDQuery a un objeto Tpath.
El paso inverso, es decir pasar del Tpath al Blodfield lo tengo solucionado y funcionando sin problemas.

Por lo que yo he entendido de la pregunta, la respuesta es NO SE PUEDE.
Entiendo que tienes una firma en un formato gráfico (JPG, PNG,...) y quieres cargar el contenifdo en un TPath. En tiendo que con TPath te refieres a la clase gráfica de FMX:
https://docwiki.embarcadero.com/Libr....Objects.TPath

TPath es una forma de representar un gráfico a partir de definir puntos, líneas y curvas. Algo así como un gráfico vectorial.
Para que nos entendamos, si defines un TPath (en su propedad Data) con algo como esto:

"M1,0 L2,1 L1,2 L0,1 L1,0 Z"

Obtendrás en pantalla esto:


Por lo tanto convertir "directamente" una imagen almacenada (una firma) a un TPath no es posible.

david.camaleon 25-04-2023 13:29:49

Muchas gracias por tu respuesta, Neftali.

Has entendido perfectamente la pregunta y como sospechaba no es posible.


Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 551286)
Por lo que yo he entendido de la pregunta, la respuesta es NO SE PUEDE.
Entiendo que tienes una firma en un formato gráfico (JPG, PNG,...) y quieres cargar el contenifdo en un TPath. En tiendo que con TPath te refieres a la clase gráfica de FMX:
https://docwiki.embarcadero.com/Libr....Objects.TPath

TPath es una forma de representar un gráfico a partir de definir puntos, líneas y curvas. Algo así como un gráfico vectorial.
Para que nos entendamos, si defines un TPath (en su propedad Data) con algo como esto:

"M1,0 L2,1 L1,2 L0,1 L1,0 Z"

Obtendrás en pantalla esto:


Por lo tanto convertir "directamente" una imagen almacenada (una firma) a un TPath no es posible.


david.camaleon 25-04-2023 13:35:34

Mucha gracias por tu respuesta:

No se trata de pasar un Tpah a un bitmap, si no de lo contrario.

Pero te agradezco muchísimo tu interés y la respuesta, que es perfecta para pasar un tpah a un bitmap y guardarlo en un campo de un DataSet.

De hecho estuve buscando esta solución durante algunas horas. si en vez de eso hubiera puesto la consulta aquí en el foro, me habría ahorrado mucho tiempo con tu respuesta.


Cita:

Empezado por duilioisola (Mensaje 551281)
En principio es la inversa de que lo que te han contestado para cargar.

Código Delphi [-]
  img := Tbitmap.Create(Trunc(Firma.Width), Trunc(Firma.Height));
  try
    img.Canvas.BeginScene;
    try
      firma.PaintTo(img.Canvas, firma.LocalRect);
    finally
      img.Canvas.EndScene;
    end;
    m := TmemoryStream.Create;
    try
      Dataset.close;     
      Dataset.open;     
      Dataset.CampoFIRMA.SavetoStream(m);
      img.LoadFromStream(m);
    finally
      FreeAndNil(m);
    end;
  finally
    FreeAndNil(img);
  end;


Neftali [Germán.Estévez] 25-04-2023 16:32:37

Cita:

Empezado por david.camaleon (Mensaje 551305)
Muchas gracias por tu respuesta, Neftali.
Has entendido perfectamente la pregunta y como sospechaba no es posible.

Fíjate que he dicho literalmente:
"Por lo tanto convertir "directamente" una imagen almacenada (una firma) a un TPath no es posible"

Otra cosa es lo que siempre decimos: "En informática no hay nada imposible, lo que hay que evaluar es cuanto cuesta hacerlo".

Entiendo que lo que necesitas sería algo así como utilizar un OCR, que permite reconocer un texto en formato imagen y extraer de ahí un texto como string. En tu caso tienes una imagen, que al ser una firma podemos considerar o convertir en "monocromo" y de ahí extraer un TPath. Al final es como pasar una imagen "normal" a vectorial y eso, aunque no es simple, es posible.

Me ha picado la curiosidad y he buscado un poco sobre eso y he llegado a este artículo:
http://cardhouse.com/computer/vector.htm
Que acaba utilizando este código:
http://cardhouse.com/computer/vectcode.htm

Por lo que he entendido permite convertir un TBitmap, que almacena en una matriz de 0/1 (que cuadra con lo que podría ser una firma) y lo acaba convirtiendo en una lista de vectores. No debería ser complicado, convertir esos vectores en un TPath.


Por si te interesa y quieres seguir investigando...

david.camaleon 26-04-2023 09:32:12

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 551313)
Fíjate que he dicho literalmente:
"Por lo tanto convertir "directamente" una imagen almacenada (una firma) a un TPath no es posible"

Otra cosa es lo que siempre decimos: "En informática no hay nada imposible, lo que hay que evaluar es cuanto cuesta hacerlo".

Entiendo que lo que necesitas sería algo así como utilizar un OCR, que permite reconocer un texto en formato imagen y extraer de ahí un texto como string. En tu caso tienes una imagen, que al ser una firma podemos considerar o convertir en "monocromo" y de ahí extraer un TPath. Al final es como pasar una imagen "normal" a vectorial y eso, aunque no es simple, es posible.

Me ha picado la curiosidad y he buscado un poco sobre eso y he llegado a este artículo:
http://cardhouse.com/computer/vector.htm
Que acaba utilizando este código:
http://cardhouse.com/computer/vectcode.htm

Por lo que he entendido permite convertir un TBitmap, que almacena en una matriz de 0/1 (que cuadra con lo que podría ser una firma) y lo acaba convirtiendo en una lista de vectores. No debería ser complicado, convertir esos vectores en un TPath.

Por si te interesa y quieres seguir investigando...

Buenos días,

Muchas gracias una vez más.

Al final opté por una solución algo más simple. Me explico:

Se trata de un formulario en FireMokey que sirve para el mantenimiento de una tabla de una base de datos, que entre otros campos almacena la firma del cliente como jpg.

1.- Cuando inserto un registro en la base de datos hago una conversión de Tpath a Bitmap y lo almaceno en un campo tipo Blob. El problema viene al tratar de modificar un registro ya existente, en cuyo caso, tengo que presentar el campo Blob almacenado como firma en el objeto tpath de un form, para que pueda ser alterado y almacenado en la base de datos. Aquí es donde hay que pasar el campo de la base de datos almacenado como jpg a tpath.

2.- Mi solución:

Apoyándome en un Timage dentro de un Trectangle, utilizo el Tpath para editar la firma y mediante un botón se almacena en el Timage. Con esto siempre uso este último objeto para intercambiar la información entre la base de datos y el formulario.

Si se trata de una modificación, al leer el registro, cargo al campo blob sobre un objeto Timage mostrando así el contenido de la firma. Si el usuario edita el objeto tpath, debe hacer clic para pasar el contenido de éste al Timage, y es este último el que almaceno en el campo de la base de datos.

Inserción : Tpath ---> Timage --> Campo BD

Modificación : Campo BD --> Timage ; si se edita el Tpath, entonces Tpath --> Timage . Siempre se graba el Timage sobre el campo de la BD.

Espero haberme explicado


La franja horaria es GMT +2. Ahora son las 08:59:39.

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