Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   String To TMemoryStream (https://www.clubdelphi.com/foros/showthread.php?t=66439)

Gimli 19-02-2010 19:13:50

String To TMemoryStream
 
Necesito pasar un String que contiene una imagen de una firma digitalizada a un TmemoryStream para poder cargarlo dentro de una imagen

El codigo que tengo es el siguiente y no funciona...

Código Delphi [-]
 
 corriente := TMemoryStream.Create;
 corriente.SetSize(length(firma));

//aqui he probado estas cuatro cosas, y ninguna funciona 
(solo una cada vez, claro esta...)
 corriente.write(PChar(FIRMA)^, length(FIRMA));
 corriente.read(PChar(FIRMA)^, length(FIRMA));
 corriente.write(FIRMA[1], length(FIRMA));
 corriente.read(FIRMA[1], length(FIRMA));
  
 corriente.Seek(0, soFromBeginning);

 imagen.Bitmap.LoadFromStream(corriente); // no carga nada
 imagen.Bitmap.SaveToFile('temp.jpg'); // crea un archivo de 1kb con un puntito

¿Que tengo mal?, ¿como es el modo correcto de hacerlo?

Al González 20-02-2010 06:05:18

Creo que depende de qué cosa sea el String Firma. Estás manejando sus caracteres como si fuera el contenido binario de una imagen BMP (que además estás guardando con extensión .jpg).

¿Podrías darnos más detalles de cómo se obtiene ese String y decirnos también qué versión de Delphi utilizas?

Considera que el primer byte de valor 0 de la imagen binaria podría causar que el String quede truncado. Sería útil saber cómo se carga esa imagen en el String Firma.

Un saludo.

Al González. :)

Gimli 20-02-2010 09:07:49

Uso Delphi 7, la firma digitaliza se encuentra en formato TIF INTEL LITTLE ENDIAN, empieza con 49492A

He comprobado a guardarla MANUALMENTE(copiando y pegando) en un Blob en la BBDD y funciona, copiando el string y pegandolo y me lo almacena bien y luego se puede mostrar, ademas se puede guardar como un jpg, el componente imagen que uso no es un TImagen, sino otro que permite mostrar tiff.

Si lo guardo el string en la BBDD desde Delphi, no lo guarda exactamente igual que la cadena, si no que cambia totalmente. El contenido guardado no es el string original

Como no he conseguido guadarlo en la BBDD para usarla de contenedor temporal, queria pasar el string a un TStream y cargarlo en la imagen, para posteriormente almacenarlo como .jpg en el disco duro y almacenar solo la ruta del fichero.

El caso es que no carga la imagen y al salvar el contenido en un jpg se crea un fichero de 1kb con un puntito negro unicamente

Red_Leon 25-02-2010 16:13:17

Prueba esto y nos cuentas

Código Delphi [-]
var
  cadena:String;
  stream:TMemoryStream;
  valor,i: Integer;
begin
  {Inicializacion de variables}
  stream:=TMemoryStream.Create;
  cadena:= {Tu forma de obtener la cadena}
  i:=1;
  while i <= length(stringHex) do
  begin
    valor:=Ord(cadena[i]);
    {Se escribe el valor del caracter ya que es una cadena de Bytes en vez de de caracteres realmente};
    stream.Write(valor,1);
    Inc(i);
  end;
  stream.Position:=0;
  {Carga este Stream en tu componente}

Yo tengo imagenes en un xml y de cadena las paso a TImagen y este codigo me funciona perfectamente.

Gimli 26-02-2010 16:50:59

Gracias por el intento pero me sigue pasando lo mismo...

Me he dado cuenta que la imagen que carga en un unico puntito negro

pongo el codigo completo, para que lo veais

Código Delphi [-]
procedure TForm1.Button4Click(Sender: TObject);
var
    cadena:String;
    stream:TMemoryStream;
    valor,i: Integer;
    s:string;
begin
s:='49492A00D4020000CB726A97FFFFFFF3270FC11883282B615840819C1D95B520820CE2';
s:=s+'3C20833D4B8410660D7410334ECAD85A40CF817090617410F4BA4CAD8504BA0B3A0252';
s:=s+'CD0C863848C8BB65596ACDB3A09146211C6CADD124A1B3EFD20920832B7C1241041174';
s:=s+'CFBB4124105867DBA49041619F66A9241058651A2492099408519A4904B674B092482C';
s:=s+'3292904925B296CCCD24825B29691587D9092082652994B3867DD12482D94B18656FD2';
s:=s+'496CA25D9F76924B6512327E7D8E9249944852A90D067334925B2950433A52D2F8652D';
s:=s+'2492D94A6CA585A5B29499448924994B1B3A9AD2D9416194A54BFB2829696CA0A65022';
s:=s+'492FB395AF652CE19452924B6502B285D697D942A92F65023284D693296B65097FECA1';
s:=s+'A497F65012F652CECA4892BD942A1594AD63E4C05B28224BCEA09672FD94B241772898';
s:=s+'650C5E42C41B2AB5E40C08335656A92C8809D95A765508415D9442CAC06CECF459140D';
s:=s+'050B8657A489309F65773589A5655ACD05FB29D190D8619449B464908E2FB665589E95';
s:=s+'045D191CBFA4CF213FD20CA909594A6A932A437FECA90D74A932A407FA4CA90174A932';
s:=s+'A463A5D952496502E932A44FA5499522656F295265495FFB2A4A3A5499E40FA54832A4';
s:=s+'5FA54995211FECA9082B774A932A432CA175499521856EE95265493F4BFFD26549395B';
s:=s+'8A5D952AFA549952ACADBD2A4CA955D2ECA95456C7A549952D7A549952D4AD8E5185D9';
s:=s+'52D3A549952D0AD9AD2ECA907C25499520CA34841765488E82A4CF2414670970CA91FA';
s:=s+'0A932A4728CA12ECA95384152654A851914405D9E53292E12A4195299495082ECA94CE';
s:=s+'B5082A4CF2994B3082A41952994B1082ECF2F392074832A67D9994A81526550AD999C1';
s:=s+'4223AECF33ECCCE560BA4195436CC8E2A17D9483ECC8C6099F499D056CD09D447AF867';
s:=s+'3952820B83D20CA39E451ECE72A42FA4192C2A42DE76525D21FFFA5FFF4BFD2FF4BFFE';
s:=s+'932B605F4BA5D78FFFDE1CB7535656D432B6138E00200200080000010300010000008C';
s:=s+'0100000101030001000000A50000000301030001000000040000001101040001000000';
s:=s+'080000001701040001000000CB0200001A010500010000003A0300001B010500010000';
s:=s+'004203000032010200140000004A030000000000000000006400000001000000640000';
s:=s+'0001323031303A30313A32372031393A31323A343600';

    stream:=TMemoryStream.Create;
    cadena:= s;
    i:=1;
    while i <= length(cadena) do
    begin
        valor:=Ord(cadena[i]);
        stream.write(valor,1);
        Inc(i);
    end;
    stream.Position:=0;

  guiImage1.Bitmap.LoadFromStream(stream);
  guiimage1.Bitmap.SaveToFile('temp.jpg');
end;

sin embargo esto de aqui abajo si funciona, en la tabla pvTable1 he copiado y pegado manualmente el string s del procedure de arriba en el campo IMAGEN

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
    Corriente : TMemoryStream;
begin
  pvtable1.open
  Corriente := TMemoryStream.Create;

  pvtable1IMAGEN.SaveToStream(Corriente);
  Corriente.Seek(0,soFromBeginning);

  guiImage1.Bitmap.LoadFromStream(corriente);
  guiimage1.Bitmap.SaveToFile('temp.jpg');
end;

Gracias, y a ver si me ayudais a dar con el problema

Red_Leon 02-03-2010 09:23:12

La cadena que has puesto me es estraña, me explico,
Cuando tratas con una cadena de un archivo (ya sea imagen, exe ...) t sueles encontrar valores (caracteres) muy diferentes, entre ellos caracteres no imprimibles (caracteres del #0...#32), por lo cual no sabria decirte si la cadena que le estas poniendo es correcta o no.

Pueden ser 2 opciones:

- La cadena es correcta: Puede ser que le haga falta alguna transformación (parece una cadena Hexadecimal, mas que una cadena de un fichero).

- La cadena es incorrecta: Puede ser que este desechando caracteres no imprimibles que son necesarios para la creación del Stream de la Imagen.

También si el 2º código te funciona puedes abrir el archivo 'temp.jpg' con algun editor avanzado (ultraedit) y ver el valor de cada byte (caracter) y verificar que la cadena sea la correcta, también lo puedes ver si t curras un pequeño programa desde delphi.

Espero tus noticias

Gimli 02-03-2010 12:19:01

Correcto la cadena es una cadena hexadecimal y en la forma en la que se presenta es correcta, pues la recibo en un string a traves de un socket.
La imagen la devuelve un terminal hardware tactil que permite firmar sobre él.

Voy a buscar el ultraEdit a ver si saco algo en claro...
Gracias

Red_Leon 02-03-2010 15:36:24

Entonces si es hexadecimal sera una cosa asi

Código Delphi [-]
while i <= length(cadena) do
begin
  valor:=StrToInt('$'+ cadena[i]+cadena[i+1]);
  stream.write(valor,1);
  i:=i+2;
end;

Un Saludo,

Gimli 03-03-2010 11:23:50

EXITO, MUCHAS GRACIAS!! Red_Leon
Cambiando el bucle por este ultimo he conseguido que funcione!

Creo que optare por cagar la imagen en el componente y guardarla en un .jpg, para solo almacenar en la BBDD la ruta de la misma.

Tema solucionado, gracias a todos por vuestro interes


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

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