Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Codificar una imagen como texto (https://www.clubdelphi.com/foros/showthread.php?t=97643)

CarlosCorp 22-08-2025 01:57:50

Codificar una imagen como texto
 
Hola amigos, espero que me puedan ayudar con una duda que tengo.
He creado un programa donde tengo un stringgrid con varios registros (de 20 a 30), en cada celda hay datos tipo string, integer. Etc., Los cuales los guardo en un archivo en formato de texto para luego volver a cargarlos en el stringgrid.
La cuestión es que quiero asignarle una imagen pequeña a cada registro del stringgrid. Pero me pregunto si se podrá codificar, por así decirlo, la imagen para que quede en forma de texto y guardarlo en el mismo archivo tipo texto para luego abrirlo y convertirlo nuevamente a imagen en un tImage.
Ojalá me haya explicado bien. Espero puedan ayudarme. Gracias.

siyei 22-08-2025 08:46:13

Para guardar una imagen como texto tienes que utilizar algún formato como Base64:

Código Delphi [-]
uses
  Classes, SysUtils, JPEG, PNGImage, Vcl.Imaging.pngimage, Soap.EncdDecd;

procedure ImagenAGuardarComoTexto(const FileName, TextoFile: string);
var
  Img: TPicture;
  Stream: TMemoryStream;
  Texto: TStringList;
  Base64Str: string;
begin
  Img := TPicture.Create;
  Stream := TMemoryStream.Create;
  Texto := TStringList.Create;
  try
    // Cargar la imagen desde archivo
    Img.LoadFromFile(FileName);

    // Guardar la imagen en un stream
    Img.Graphic.SaveToStream(Stream);
    Stream.Position := 0;

    // Convertir a Base64
    Base64Str := EncodeBase64(Stream.Memory, Stream.Size);

    // Guardar en archivo de texto
    Texto.Text := Base64Str;
    Texto.SaveToFile(TextoFile);
  finally
    Img.Free;
    Stream.Free;
    Texto.Free;
  end;
end;

Para recuperarla:

Código Delphi [-]
procedure TextoAGuardarComoImagen(const TextoFile, FileName: string);
var
  Stream: TMemoryStream;
  Texto: TStringList;
  Img: TPicture;
  Bytes: TBytes;
begin
  Stream := TMemoryStream.Create;
  Texto := TStringList.Create;
  Img := TPicture.Create;
  try
    // Cargar el texto (Base64)
    Texto.LoadFromFile(TextoFile);
    Bytes := DecodeBase64(Texto.Text);

    // Guardar los bytes en el stream
    Stream.WriteBuffer(Bytes[0], Length(Bytes));
    Stream.Position := 0;

    // Cargar la imagen desde stream
    Img.LoadFromStream(Stream);

    // Guardar la imagen en archivo
    Img.SaveToFile(FileName);
  finally
    Stream.Free;
    Texto.Free;
    Img.Free;
  end;
end;

Casimiro Noteví 22-08-2025 11:13:45

Por favor, no olvides usar las etiquetas para código:

CarlosCorp 22-08-2025 18:12:15

Muchas gracias por la respuesta, lo implementaré para ver cómo me sale. ����


La franja horaria es GMT +2. Ahora son las 06:30:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi