Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Convertir de un fichero a Stream una imagen (https://www.clubdelphi.com/foros/showthread.php?t=95781)

novato_erick 06-08-2022 01:07:25

Convertir de un fichero a Stream una imagen
 
Hola chicos:

Tengo una aplicación utilizando DataSnap la cual aún manejo el componente DBExpress aun no he pasado a FireDac pero la aplicación corre de maravillas la cual desde dispositivos Android realizo consulta y efectuó actualización por cierto es del 2015 :rolleyes: ahora revisando noté que algunos clientes ah almacenado imagenes en formato png o jpeg a los artículos pero en la db no se guarda la imagen en formato blob pero mientras que la aplicación se guarda en una ruta en el servidor en su respectiva carpeta de imágenes ejemplo

CAMPO TIPO
ID_ART INTEGER
NOMBRE VARCHAR(100)
IMAGEN VARCHAR(150)

VALOR
C:\MI PROGRAMA\IMAGENES\FOTO1.PNG

Encontré este link interesante: https://delphibasico.com/2013/03/25/...magen-parte-2/ la cual es lo que considero que funcionaría sin embargo mi primera limitación es que cree esta función para tratar de convertir dicha ruta y salvar en un Stream

ejemplo:

Código Delphi [-]
function TServerMethods1.GetImagenBannerAsStream(ASQLQuery: TSQLQuery;
  AIDBanner: Integer): TStream;
var
 stream: TMemoryStream;
 MiImagenDB: TImage;
begin
  if (ASQLQuery.Active) then ASQLQuery.Close();
  with ASQLQuery do
  begin
    ParamByName('id_articulo').AsInteger := AIDBanner;
    Open;
  end;
  //
  stream := TMemoryStream.Create;
  MiImagenDB := TImage.Create(MiImagenDB);
  try
    MiImagenDB.Picture.LoadFromFile(qArtImagenIMAGEN.AsString);
    MiImagenDB.Update;
    MiImagenDB.Picture.SaveToStream(stream);

  finally
    MiImagenDB.Free;
    Result := stream;
    stream.Free;
  end;
  ASQLQuery.Close;
end;

lo que hice es correcto es posible?

Saludos

novato_erick

duilioisola 08-08-2022 11:01:54

Creo que no es correcto porque liberas el stream antes de devolverlo

Código Delphi [-]
function TServerMethods1.GetImagenBannerAsStream(ASQLQuery: TSQLQuery;
  AIDBanner: Integer): TStream;
var
 stream: TMemoryStream;
 MiImagenDB: TImage;
begin
  if (ASQLQuery.Active) then ASQLQuery.Close();
  with ASQLQuery do
  begin
    ParamByName('id_articulo').AsInteger := AIDBanner;
    Open;
  end;
  //
  stream := TMemoryStream.Create; <== AQUI CREAS EL STREAM
  MiImagenDB := TImage.Create(MiImagenDB);
  try
    MiImagenDB.Picture.LoadFromFile(qArtImagenIMAGEN.AsString);
    MiImagenDB.Update;
    MiImagenDB.Picture.SaveToStream(stream);

  finally
    MiImagenDB.Free;
    Result := stream; <== AQUI DEVUELVES EL STREAM QUE SERA LIBREADO EN LA SIGUIENTE LINEA
    stream.Free; <== AQUI LIBERAS EL STREAM
  end;
  ASQLQuery.Close;
end;


Código Delphi [-]
function TServerMethods1.GetImagenBannerAsStream(ASQLQuery: TSQLQuery;
  AIDBanner: Integer): TStream;
var
 MiImagenDB: TImage;
begin
  if (ASQLQuery.Active) then ASQLQuery.Close();
  with ASQLQuery do
  begin
    ParamByName('id_articulo').AsInteger := AIDBanner;
    Open;
  end;
  
  // AQUI CREAS EL STREAM
  // Quien lo consuma, deberá encargarse de librear la memoria
  Result := TMemoryStream.Create;
  try
    MiImagenDB := TImage.Create(MiImagenDB);
    try
      MiImagenDB.Picture.LoadFromFile(qArtImagenIMAGEN.AsString);
      MiImagenDB.Update;
      MiImagenDB.Picture.SaveToStream(Result);

    finally
      MiImagenDB.Free;
    end;
  except
    // libero el stream si hubo algun problema
    Result.Free;
  end;
  ASQLQuery.Close;
end;

[...]

var
 AStream: TMemoryStream;
begin
  AStream := GetImagenBannerAsStream(Q, 1234);
  try
     // Hacer algo con el Stream
  finally
     AStream.Free;
  end;
end;


La franja horaria es GMT +2. Ahora son las 09:15:37.

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