Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   TImage a TStream (https://www.clubdelphi.com/foros/showthread.php?t=84310)

mjjj 03-10-2013 21:35:21

TImage a TStream
 
Estimados,

necesito crear un TStream en memoria a contar de un componente TImage, que tiene una imagen previamente cargada.
Como hago esto?

Gracias

jhonny 03-10-2013 21:51:31

Si la imagen ya está cargada, debería bastar con esto:

Código Delphi [-]
var VStream: TStream;
begin
   VStream := TMemoryStream.Create;
   Image1.Picture.Bitmap.SaveToStream(VStream);
end;

Donde Image1 es el objeto TImage que ya tiene la imagen cargada.

mjjj 04-10-2013 19:51:53

Estimado, estoy probando Delphi XE5, con una aplicación para Android y un servidor DataSnap.
Lo que necesito es insertar un registro en una base de Dato Firebird 2.5, en un campo tipo BLOB (size 16384, type Text), desde un cliente con el procedimiento insert_imagen (servidor DataSnap).
La imagen está previamente cargada y visualizada en un TImage, llamado imgCameraPicture.

Código Delphi [-]
procedure TServerMethods1.insert_imagen(imagen: TStream; usuario: integer);
begin
  with ibsql1 do
  begin
    transaction.Active := true;;
    close;
    sql.clear;
    sql.add('insert into imagenes (usuario, imagen, fecha)');
    sql.add('values (:usuario, :imagen, current_timestamp)');
    ParamByName('imagen').LoadFromStream(imagen);
    ParamByName('usuario').asinteger :=usuario;
    execquery;
    transaction.CommitRetaining;
  end;
end;

Y desde el cliente llamo al procedimiento como sigue.

Código Delphi [-]
var
  myServer : TServerMethods1Client;
  stream : TStream;
begin
if SQLConnection1.Connected then
begin
  myServer := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
  stream := TMemoryStream.Create;

    try
    imgCameraPicture.MultiResBitmap[0].bitmap.savetostream(stream);
    myServer.insert_imagen(stream, 10);

  finally

    stream.Free;
    myServer.Free;
  end;
end;
end;

con todo esto logro insertar el registro en la base de dato, pero el campo imagen está en blanco. que podrá ser ??

dec 04-10-2013 20:41:59

Hola,

Ignoro si esto:

Código Delphi [-]
imgCameraPicture.MultiResBitmap[0].bitmap.savetostream(stream);

... no sería más bien algo así:

Código Delphi [-]
imgCameraPicture.bitmap.savetostream(stream);

Pero, de todas formas, prueba esto otro:

Código Delphi [-]
imgCameraPicture.MultiResBitmap[0].bitmap.savetostream(stream);
stream.Position := 0;
myServer.insert_imagen(stream, 10);

A ver si hay suerte. ;)

mjjj 04-10-2013 23:45:32

Estimado, no he podido lograr insertar una imagen.

Respecto a tu duda, el componente TImage en XE5, trae esas opciones de poder almacenar mas de una imagen.

Habrá algún problema con la definición de la tabla??
O el código del procedimiento en el servidor?

Alguna idea?

dec 05-10-2013 00:40:38

Hola,

Comprueba que efectivamente "imgCameraPicture.MultiResBitmap[0]" contiene alguna imagen. No dudo de que sea así, pero, recuerdo haber utilizado el "imgCameraPicture" en Android y accedí la imagen mediante "imgCameraPicture.Bitmap" o algo así... según recuerdo. Lo dicho, prueba que realmente tengas ahí una imagen, prueba guardándola en un archivo o acaso con un simple "<> nil".

mjjj 07-10-2013 16:35:39

Estimado dec, revicé que realmente existiera la imagen, y así fue. Es más logré insertar la imagen, pero con el código del servidor DataSnap y un componente TIBSql en la aplicación cliente (ejecutada en win32), ya que en Android me arroja un error.

Todo apunta que tengo un problema en el servidor DataSnap, habrá que configurar alguna propiedad especial para poder transportar imagenes, en este caso TStream desde un cliente pasando un servidor DtaSnap que finalmente lo almacene en Firebird 2.5 ??

Este es el código del procedimiento que inserta el registro, cabe señalar que todos los otros campos lo inserta sin problema, el problema es que no inserta la imagen.

Código Delphi [-]
procedure TServerMethods1.insert_imagen(imagen: TStream; usuario: integer);
begin
  with ibsql1 do
  begin
    transaction.Active := true;;
    close;
    sql.clear;
    sql.add('insert into imagenes (usuario, imagen, fecha)');
    sql.add('values (:usuario, :imagen, current_timestamp)');
    ParamByName('imagen').LoadFromStream(imagen);
    ParamByName('usuario').asinteger :=usuario;
    execquery;
    transaction.CommitRetaining;
  end;
end;

mjjj 12-12-2013 19:50:14

Estimados, he tenido que retomar este tema, pero sigo sin poder resolverlo.
Para evitar tener que trabajar con DataSnap (ya que aún no lo conozco por completo), he intentado enviar la imagen por medio de un servidor FTP, y ocurre que logro guardar la imagen en el servidor, pero esta tiene un tamaño de 0 byte.

Código Delphi [-]
procedure ...
var
   Stream: TMemoryStream ;
begin

  Stream:= TMemoryStream.Create;
  Stream.Position:= 0;
  image1.Bitmap.SaveToStream(Stream);

// me aseguro que el memorystream tengo alguna imagen, y efectivamente aparece la imagen en el segundo TImage
  image2.Bitmap.LoadFromStream(stream);

with idftp1 do
try
disconnect;
passive:=true;
Connect;

Put(Stream, 'MAS.JPG', FALSE);

finally
      STREAM.Free;
      idftp1.Disconnect;
 
end;

Esto no arroja ningún error, pero tampoco la imagen que deseo en el servidor.
Que podrá ser ???

pape19 03-09-2014 16:57:05

Hace un par de días que reniego con lo mismo, tu problema original.

En mi caso, mi app en Android(Cliente) toma una foto, y luego se guarda con un ClientDataSet. Esta imagen, la transformo en un stream. Luego en la bd del servidor, se hace la respectiva conversión para el campo blob.

Al igual que vos, no me guarda bien la imágen, y si los otros campos de la tabla. Pudiste resolverlo?

Gracias.


La franja horaria es GMT +2. Ahora son las 11:19:24.

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