Ir al contenido


Foto

Cargar imágenes de tipo variant en un TImage


  • Por favor identifícate para responder
26 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 02:01

Pues eso, estoy trabajando con un ActiveX de la librería BioKey de las cuales trata el manejo y captura de huellas digitales, estoy en una situación en la que debo mostrar la plantilla de una huella desde la BD a un TImage o similar, he conseguido la siguiente función que dice así:



delphi
  1. function DecodeTemplate1(const ASour as String) as variant;



Transfer the template string Asour which is BASE64 formatted into the
Variant-typed template used by the control.


Pues no sé cargaría esa imagen o plantilla a un TImage, ahora hay otra función que no entiendo cómo atacarla, dice así:



vb
  1. Sub PrintImageAt(HDC As OLE_HANDLE, X As Long, Y
  2. As Long, aWidth As Long, aHeight As Long)



At the location specified by (x,y), display the fingerprint image in
accordance with the size specified by (aWidth, aHeight). HDC is the HDC for the
window in which the fingerprint will be shown.


Una mano?

Saludos.

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 09 septiembre 2010 - 02:47

La codificación BASE64 puedes manejarla con las Indy pero mejor mira este enlace de seoane.



delphi
  1. Sub PrintImageAt(HDC As OLE_HANDLE, X As Long, Y
  2. As Long, aWidth As Long, aHeight As Long)


Parece Visual Basic, ¿no?. Lo aborrezco.

La declaración podría ser algo así:


delphi
  1. procedure PrintImageAt(DC: HDC; X, Y, Width, Height: integer);



Saludos.

  • 0

#3 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 mensajes
  • LocationBuscando a Wally

Escrito 09 septiembre 2010 - 04:16

Hola.



delphi
  1. X As Long, Y
  2. As Long, aWidth As Long, aHeight As Long)



Creo entender que se refiere a un punto dado (X,Y), a partir del cual
se ha de pintar la huella. Algo así como la "esquina superior izquierda".

No se si es eso lo que necesitas.

Saludos.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 septiembre 2010 - 08:59

Hola Amigos, gracias por sus respuesta, las funciones las entiendo, el problema mío es cargar el resultado en un TImage, por ejemplo, usando la primera función he hecho esto:



delphi
  1. procedure TForm1.ShowTemplate(v: OLEvariant);
  2. Var
  3.   ms: TMemoryStream;
  4.   len, i: Integer;
  5.   p: POinter;
  6. Begin
  7.   ms := TMemoryStream.Create;
  8.     try
  9.       len := VarArrayHighBound( V, 1 ) - VarArrayLowBound(V, 1) + 1;
  10.       p  := varArrayLock( V );
  11.         try
  12.           ms.Writebuffer( p^, len );
  13.         finally
  14.           varArrayUnlock( V );
  15.         end;
  16.       ms.Position := 0;
  17.       FHuellas.Image1.Picture.Graphic.LoadFromStream(ms);
  18.     finally
  19.       ms.free
  20.     end;
  21. end;
  22.  
  23. procedure TForm1.DBGrid1DblClick(Sender: TObject);
  24. begin
  25. FHuellas := TFHuellas.Create(self);
  26.   try
  27.     FHuellas.Huellas.close;
  28.     FHuellas.Huellas.SQL.Clear;
  29.     FHuellas.Huellas.SQL.Text := 'Select Template from fptable where EnrollNumber = :ID';
  30.     FHuellas.Huellas.Parameters.ParamByName('ID').Value := IntToStr(StrToInt(EmpleadosCODE.AsString));
  31.     FHuellas.Huellas.Open;
  32.     ShowTemplate(FHuellas.ZKHuella.DecodeTemplate1(FHuellas.Huellas.Fields[0].AsVariant));
  33.     FHuellas.ShowModal;
  34.   finally
  35.     FHuellas.Free;
  36.   end;
  37. end;



Pues me da el siguiente error:

---------------------------
Debugger Exception Notification
---------------------------
Project WEmployees.exe raised exception class EAccessViolation with message 'Access violation at address 004B90B4 in module 'WEmployees.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------


En cuanto a la segunda función, pues no sé qué valor lleva HDC, lo demás lo entiendo.

Saludos.

  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 15 septiembre 2010 - 07:45

Aún sigo sin cargar la imagen/Plantilla :(
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 15 septiembre 2010 - 04:19

¿Has experimentado con algo así?


delphi
  1. procedure ShowTemplate(v: variant; Size: integer);
  2. Var
  3.   ms: TMemoryStream;
  4.   len, i: Integer;
  5.   p: POinter;
  6. Begin
  7.   ms := TMemoryStream.Create;
  8.   ms.Writebuffer( v, Size);
  9.   ms.Position := 0;
  10.   FHuellas.Image1.Picture.Graphic.LoadFromStream(ms);
  11.   ms.free
  12. end;
  13.  
  14. procedure TForm1.DBGrid1DblClick(Sender: TObject);
  15. begin
  16. FHuellas := TFHuellas.Create(self);
  17.   try
  18.     FHuellas.Huellas.close;
  19.     FHuellas.Huellas.SQL.Clear;
  20.     FHuellas.Huellas.SQL.Text := 'Select Template from fptable where EnrollNumber = :ID';
  21.     FHuellas.Huellas.Parameters.ParamByName('ID').Value := IntToStr(StrToInt(EmpleadosCODE.AsString));
  22.     FHuellas.Huellas.Open;
  23.     ShowTemplate(FHuellas.ZKHuella.DecodeTemplate1(FHuellas.Huellas.Fields[0].AsVariant,
  24.                 Round((Length(FHuellas.Huellas.Fields[0]))-3)*3/4));
  25.     FHuellas.ShowModal;
  26.   finally
  27.     FHuellas.Free;
  28.   end;
  29. end;



Saludos.

  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 15 septiembre 2010 - 05:56

Ah vaya, no lo he probado de esa forma, una duda, el por que del lenght? trato de entenderlo, me explicas? :$
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 02:22

Ah vaya, no lo he probado de esa forma, una duda, el por que del lenght? trato de entenderlo, me explicas? :$


El sistema de codificación Encode64 pasa los valores de cadena de 8 bits a 6bits. Al codificar el tamaño aumenta y al descodificar disminuye. La proporción es 4/3.

Con esto, la conversión de tamaño así: Round(size*3/4).

Pero en realidad puede ser un poco mas complejo. La API CryptBinaryToString, cuando la usamos para codificar en Base64 (CRYPT_STRING_BASE64) codifica el buffer pasado completo y le añade un retorno de carro (13) y otro de línea (10) y un nulo final. Cuando se encripta una cadena PCHAR, el cero final también lo encripta.

Para saber el tamaño desencriptado debemos quitar los 3 últimos caracteres añadidos y aplicar la regla de conversión:



delphi
  1. Round((size-3)*3/4);





delphi
  1.     ShowTemplate(FHuellas.ZKHuella.DecodeTemplate1(FHuellas.Huellas.Fields[0].AsVariant,
  2.                 Round((Length(FHuellas.Huellas.Fields[0]))-3)*3/4);



Debes comprobar si el sistema que estás usando le añade esos tres caracteres de mas.

No lo he probado, pero creo que merece la pena que lo pruebes con este concepto. ;)


Saludos.
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 septiembre 2010 - 07:26

Probado :(

---------------------------
Debugger Exception Notification
---------------------------
Project WEmployees.exe raised exception class EAccessViolation with message 'Access violation at address 004B90DF in module 'WEmployees.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------


Por si las moscas dejaré el formato de una plantilla de huella digital tal como está guardado en la BD.



delphi
  1. A1CA1B818C2B460140362B4A01352A2C3C01124DAF41411340BB19C10DCEBC1F010CCDB14F810E33B44A810A3E2047412072A34AC12C712842412E5146250109CCCA498112CBB33E810D4B412E810B5A3C21C1075A1D5D8108192B65010927A53D810EE0AF64C1059FAF5B01082AA4320103D42632010459CC50C117DD4F39010BDB54478108E5512A0108D73C548A111017C0C67878787878787878C07E78C37878C278C0C578C778C0C578C778E2C45E6068740B17A1D889C0C35D5D5F66710C1B1E821FC0C35A5A5B5F6A161FA1B78822C0C357A1976028A24A6879C0C351814B4331A2186678C0C24DA179744238A1055525C0C24FA3687430242EC0C253A365553325C0C256A364454535C0C259A373556657C0C25BA38575857B007E78C0C260A27777875D650104C0C262A478879AEFFAC0C365A3898BBCBBC0C46AA286AACAC0C56BA179AAE0



Saludos.

  • 0

#10 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 10:27

Por lo que veo, y tras desencriptar la cadena que envías, el problema debe estar en el formato de imagen. No parece ser un bmp ni jpeg. Habrá que saber que tipo de imagen es.

Saludos. 
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 septiembre 2010 - 11:07

Por lo que veo, y tras desencriptar la cadena que envías, el problema debe estar en el formato de imagen. No parece ser un bmp ni jpeg. Habrá que saber que tipo de imagen es.

Saludos. 


Ah joder, habrá alguna forma de saberlo?
  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 11:26

Ah joder, habrá alguna forma de saberlo?


No es bmp, ni jpg, ni png, ni gif.  :|

La documentación de las librerías usadad debería dar la pista adecuada.

Saludos.
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 septiembre 2010 - 11:47

Leyendo con más detenimiento encontré esto:

In SDK fingerprint templates are saved and called by means of Variant variable. What is stored is one-dimension binary arrays, which can not be read-in and read-out by SQL sentences as for character strings. There are two solutions:

1、 Method EncodeTemplate and method DecodeTemplate are able to make
BASE64 code transfer between Variant variables and string variables. One
point, which should be improved, is that after variables being transferred into
strings, the template length will be increased by about 1/3.

2、 Directly work on Variant variables. An example is shown as the following:
Delphi, CB:



delphi
  1. procedure TFPProcess.SaveFPData(AQuery: TADOQuery; AFingerID: Integer; AFPData:
  2. OleVariant);
  3. var
  4. pData: PChar;
  5. begin
  6. with AQuery do begin
  7. Close;
  8. SQL.Clear;
  9. SQL.Add('SELECT * FROM zkFingerPrint WHERE FingerID = ' + IntToStr(AFingerID));
  10. Open;
  11. if IsEmpty then
  12. Append
  13. else
  14. Edit;
  15. FieldByName('FingerID').Value := AFingerID;
  16. //Save the fingerprint template
  17. with TBlobStream(CreateBlobStream(FieldByName('Template'), bmWrite)) do begin
  18. pData := VarArrayLock(AFPData);
  19. try
  20. Write(pData^, VarArrayHighBound(AFPData, 1) - VarArrayLowBound(AFPData, 1) + 1);
  21. finally
  22. VarArrayUnlock(AFPData);
  23. end;
  24. Free;
  25. end;
  26. Post;
  27. Close;
  28. end;
  29. end;





delphi
  1. procedure TFPProcess.GetFPData(AQuery: TADOQuery; AFingerID: Integer; var AFPData:
  2. OleVariant);
  3. var
  4. pData: PChar;
  5. begin
  6. with AQuery do begin
  7. Close;
  8. SQL.Clear;
  9. SQL.Add('SELECT * FROM zkFingerPrint WHERE FingerID = ' + IntToStr(AFingerID));
  10. Open;
  11. //read-out data
  12. if not IsEmpty then
  13. with TBlobStream(CreateBlobStream(FieldByName('Template'), bmRead)) do begin
  14. AFPData := VarArrayCreate([0, Size + 1], varByte);
  15. pData := VarArrayLock(AFPData);
  16. try
  17. Read(pData^, Size);
  18. finally
  19. VarArrayUnlock(AFPData);
  20. end;
  21. Free;
  22. end;
  23. Close;
  24. end;
  25. end;




Pero aún no encuentro qué tipo de imagen es, seguiré leyendo.

Saludos.
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 septiembre 2010 - 12:32

Bueno, sigo con esto, encontré una función que obtiene una imagen BMP de la huella, y se llama así:



vb
  1. Function GetFingerImage(Byval AFingerImage) As Boolean



Pues no sé cómo cargaría el resultado en un TImage, esto no me funciona:



delphi
  1. procedure TForm1.DBGrid1DblClick(Sender: TObject);
  2. var Huella: OleVariant;
  3. begin
  4. FHuellas := TFHuellas.Create(self);
  5.   try
  6.     GetFPData(FHuellas.Huellas,EmpleadosCODE.AsInteger,Huella);
  7.     FHuellas.Image1.Picture.Assign(FHUellas.ZKHuella.GetFingerImage(Huella));
  8.     FHuellas.ShowModal;
  9.   finally
  10.     FHuellas.Free;
  11.   end;
  12. end;



Saludos.
  • 0

#15 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 01:07

¿Trataste de meter un TImage en tu formulario y cargar ese BMP directamente en él?

Saludos.
  • 0

#16 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 17 septiembre 2010 - 07:54

¿Trataste de meter un TImage en tu formulario y cargar ese BMP directamente en él?

Saludos.


Ese es el detalle amigo, cual BMP?, no hay un archivo BMP físico, sino más una imagen codificada en la BD que supuestamente dice el manual que hay de que convertirlo en BASE64 a un valor variant a través de unas de sus funciones y convertirlo a BMP, digo eso creo no? :D, ya casi me rindo :
  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.242 mensajes
  • LocationMéxico

Escrito 17 septiembre 2010 - 09:31


¿Trataste de meter un TImage en tu formulario y cargar ese BMP directamente en él?

Saludos.


Ese es el detalle amigo, cual BMP?, no hay un archivo BMP físico, sino más una imagen codificada en la BD que supuestamente dice el manual que hay de que convertirlo en BASE64 a un valor variant a través de unas de sus funciones y convertirlo a BMP, digo eso creo no? :D, ya casi me rindo :


¿ Y no puedes colocar esa base de datos para hacer algunas pruebas ?

Salud OS

[off-topic]
A rendirse a su pueblo wey
[/off-topic]
  • 0

#18 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 17 septiembre 2010 - 09:37

Pues aqui lo dejo :D
  • 0

#19 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 17 septiembre 2010 - 03:10

Ese es el detalle amigo, cual BMP?, no hay un archivo BMP físico, sino más una imagen codificada en la BD que supuestamente dice el manual que hay de que convertirlo en BASE64 a un valor variant a través de unas de sus funciones y convertirlo a BMP, digo eso creo no? :D, ya casi me rindo :


Pues me refería a esto:

Bueno, sigo con esto, encontré una función que obtiene una imagen BMP de la huella, y se llama así:



vb
  1. Function GetFingerImage(Byval AFingerImage) As Boolean



Saludos.
  • 0

#20 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 17 septiembre 2010 - 04:13

Viendo mas despacio la cadena que mandaste



delphi
  1. A1CA1B818C2B460140362B4A01352A2C3C01124DAF41411340BB19C10DCEBC1F010CCDB14F810E33B44A810A3E2047412072A34AC12C712842412E5146250109CCCA498112CBB33E810D4B412E810B5A3C21C1075A1D5D8108192B65010927A53D810EE0AF64C1059FAF5B01082AA4320103D42632010459CC50C117DD4F39010BDB54478108E5512A0108D73C548A111017C0C67878787878787878C07E78C37878C278C0C578C778C0C578C778E2C45E6068740B17A1D889C0C35D5D5F66710C1B1E821FC0C35A5A5B5F6A161FA1B78822C0C357A1976028A24A6879C0C351814B4331A2186678C0C24DA179744238A1055525C0C24FA3687430242EC0C253A365553325C0C256A364454535C0C259A373556657C0C25BA38575857B007E78C0C260A27777875D650104C0C262A478879AEFFAC0C365A3898BBCBBC0C46AA286AACAC0C56BA179AAE0



No es una codificación BASE64. Mas bien parecen números hexadecimales. El Encode64 usa todas las letras y números, y algún carácter mas.

Aún considerando que son números hexadecimales, no se ve la cabecera de formato gráfico y mucho menos de un bmp.

La clave va a estar en la documentación y ejemplos.

Saludos.
  • 0