Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Cargar una Imagen base64 en un Timage (https://www.clubdelphi.com/foros/showthread.php?t=94915)

darkamerico 23-10-2020 03:29:54

Cargar una Imagen base64 en un Timage
 
Saludos amigos, estoy realizando una consulta al Web Service que se muestra en la siguiente imagen: https://ibb.co/2t1Bch7

En particular me interesa poner mostrar el campo foto en un componente TImage.

Estoy intentando leerlo pero no se como tratar el tipo de llegada, obsérvese la imagen del error: https://ibb.co/r0QgmqZ

Agradezco cualquier ayuda en este sentido

Abrazo
Américo Torres

darkamerico 23-10-2020 03:32:51

dato adicional
 
Cita:

Empezado por darkamerico (Mensaje 538820)
Saludos amigos, estoy realizando una consulta al Web Service que se muestra en la siguiente imagen: https://ibb.co/2t1Bch7

En particular me interesa poner mostrar el campo foto en un componente TImage.

Estoy intentando leerlo pero no se como tratar el tipo de llegada, obsérvese la imagen del error: https://ibb.co/r0QgmqZ

Agradezco cualquier ayuda en este sentido

Abrazo
Américo Torres

Si desean acceder al Web Service es este: http://181.176.170.150:555/ConsultaRUCDNI.svc

ElKurgan 23-10-2020 08:28:03

Hola.

Creo que el problema te lo da la asignación de la foto.

En el Web Service viene definida como Base64, efectivamente:

<xs:element minOccurs="0" name="_foto" nillable="true" type="xs:base64Binary"/>

Por otro lado, estás asignando al Stream un array de bytes, y ese es el error que te devuelve Delphi:

[dcc32 Error] uMain.pas(73): E2010 Incompatible types: 'TStream' and 'System.TArray<System.Byte>'

Una posible solución es usar Indy para transformar el base 64 a Stream como se ve en este ejemplo; Ahí lo que hacen es cargar el base64 en un TStringStream y luego
cargarlo en la imagen de esta forma:

Código Delphi [-]
AStringStream := TStringStream.Create(DecodedBase64);
try
  AStringStream.Position := 0;
  imBase64.Picture.Bitmap.LoadFromStream(AStringStream);
finally
  AStringStream.Free;
end;
Espero que te sirva.

Un saludo

darkamerico 23-10-2020 14:04:25

gracias x responder
 
Cita:

Empezado por ElKurgan (Mensaje 538822)
Hola.

Creo que el problema te lo da la asignación de la foto.

En el Web Service viene definida como Base64, efectivamente:

<xs:element minOccurs="0" name="_foto" nillable="true" type="xs:base64Binary"/>

Por otro lado, estás asignando al Stream un array de bytes, y ese es el error que te devuelve Delphi:

[dcc32 Error] uMain.pas(73): E2010 Incompatible types: 'TStream' and 'System.TArray<System.Byte>'

Una posible solución es usar Indy para transformar el base 64 a Stream como se ve en este ejemplo; Ahí lo que hacen es cargar el base64 en un TStringStream y luego
cargarlo en la imagen de esta forma:

Código Delphi [-]AStringStream := TStringStream.Create(DecodedBase64); try AStringStream.Position := 0; imBase64.Picture.Bitmap.LoadFromStream(AStringStream); finally AStringStream.Free; end;

Espero que te sirva.

Un saludo




Amigo, Interesante sin duda el ejemplo que has citado, sin embargo ahi asumen que la imagen ya esta colocada en un componente TImage y realizan la conversion a base64 con una linea como esta:


Código Delphi [-]
imLoad.Picture.Graphic.SaveToStream(AImageStream);


En mi caso requiero tomar la cadena base64 del web service y cargarla a un Stream para luego cargarla en el componente TImage,
(el formato del base64 es Jpg por cierto) con una linea similar a esta:


Código Delphi [-]
Jpg.LoadFromStream([Stream]);


Hmmmm ando liado



Un abrazo

movorack 23-10-2020 16:26:04

Hola, ya que especificas que el formato es JPEG. puedes cargar la foto a un TJPEGImage

Código Delphi [-]
uses
  .. JPEG;

procedure TForm1.VerFoto(Foto: TArray< System.Byte >; Image: TImage);
  var
    JPEGImage: TJPEGImage;
    AStringStream: TStringStream;
begin
  AStringStream := TStringStream.Create(StringOf(Foto));
  JPEGImage := TJPEGImage.Create;
  try
    AStringStream.Position := 0;
    JPEGImage.LoadFromStream(AStringStream);
    Image.Picture.Assign(JPEGImage);
  finally
    JPEGImage.Free;
    AStringStream.Free;
  end;
end;

ElKurgan 23-10-2020 16:37:44

Es que en el mismo ejemplo, un poco más abajo, viene como CARGAR la imagen, y no como GUARDARLA.

Lo hacen exactamente como te ha indicado movorack, es decir, creando un STRINGSTREAM a partir de la foto y luego cargando la imagen con LoadFromStream(elStringStream).

Piensa que el WebService te devuelve bytes que puedes cargar en un StringStream sin problemas. En el ejemplo serían las líneas:
Código Delphi [-]
DecodedBase64 := IdDecoderMIME1.DecodeString(ABase64);
AStringStream := TStringStream.Create(DecodedBase64);
try
  AStringStream.Position := 0;
  imBase64.Picture.Bitmap.LoadFromStream(AStringStream);
finally
  AStringStream.Free;
end;


Un saludo

movorack 24-10-2020 01:03:10

Hola ElKurgan, yo hice la prueba antes de publicar la respuesta.

Con el TIdDecoderMIME, genera error al intentar cargar la imagen. No reconoce el formato que devuelve DecodeString.
En el ejemplo que le coloco, estoy usando StringOf para obtener el texto que devuelven del servicio.
Y uso el TJPEGImage para cargar el Stream y por ultimo este sea asignado al TImage



Ahora... al rato revisé y eliminé la asignación al TJPEGImage y "funciona", siempre y cuando en los uses esté la unidad JPEG

Código Delphi [-]
uses
  .. JPEG;

procedure TForm1.VerFoto(Foto: TArray< System.Byte >; Image: TImage);
  var
    AStringStream: TStringStream;
begin
  AStringStream := TStringStream.Create(StringOf(Foto));
  try
    AStringStream.Position := 0;
    Image.Picture.loadFromStream(AStringStream);
  finally
    AStringStream.Free;
  end;
end;

darkamerico 25-10-2020 01:04:29

Gracias a todos
 
Cita:

Empezado por movorack (Mensaje 538837)
Hola ElKurgan, yo hice la prueba antes de publicar la respuesta.

Con el TIdDecoderMIME, genera error al intentar cargar la imagen. No reconoce el formato que devuelve DecodeString.
En el ejemplo que le coloco, estoy usando StringOf para obtener el texto que devuelven del servicio.
Y uso el TJPEGImage para cargar el Stream y por ultimo este sea asignado al TImage



Ahora... al rato revisé y eliminé la asignación al TJPEGImage y "funciona", siempre y cuando en los uses esté la unidad JPEG

Código Delphi [-]uses .. JPEG; procedure TForm1.VerFoto(Foto: TArray< System.Byte >; Image: TImage); var AStringStream: TStringStream; begin AStringStream := TStringStream.Create(StringOf(Foto)); try AStringStream.Position := 0; Image.Picture.loadFromStream(AStringStream); finally AStringStream.Free; end; end;


Quiero agradecer individualmente a todos los que aportaron para dar esta solución, un abrazo.


Atte,
Americo Torres


La franja horaria es GMT +2. Ahora son las 18:20:19.

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