Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-02-2010
Avatar de Gimli
Gimli Gimli is offline
Miembro
 
Registrado: may 2008
Ubicación: Castilla La Mancha
Posts: 40
Poder: 0
Gimli Va por buen camino
Arrow 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?
Responder Con Cita
  #2  
Antiguo 20-02-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Responder Con Cita
  #3  
Antiguo 20-02-2010
Avatar de Gimli
Gimli Gimli is offline
Miembro
 
Registrado: may 2008
Ubicación: Castilla La Mancha
Posts: 40
Poder: 0
Gimli Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 25-02-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
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.

Última edición por Red_Leon fecha: 25-02-2010 a las 16:18:53.
Responder Con Cita
  #5  
Antiguo 26-02-2010
Avatar de Gimli
Gimli Gimli is offline
Miembro
 
Registrado: may 2008
Ubicación: Castilla La Mancha
Posts: 40
Poder: 0
Gimli Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 02-03-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
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

Última edición por Red_Leon fecha: 02-03-2010 a las 09:26:49.
Responder Con Cita
  #7  
Antiguo 02-03-2010
Avatar de Gimli
Gimli Gimli is offline
Miembro
 
Registrado: may 2008
Ubicación: Castilla La Mancha
Posts: 40
Poder: 0
Gimli Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 02-03-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
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,
Responder Con Cita
  #9  
Antiguo 03-03-2010
Avatar de Gimli
Gimli Gimli is offline
Miembro
 
Registrado: may 2008
Ubicación: Castilla La Mancha
Posts: 40
Poder: 0
Gimli Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar TMemorystream a string modulay OOP 4 29-09-2007 22:23:48
TMemoryStream almacenamiento en archivo federicoboga Varios 2 14-06-2005 22:57:46
Tmemorystream y sockets LILYBEL Varios 3 01-07-2004 15:43:52
Problema con TMemoryStream Baixa Varios 6 20-01-2004 19:36:08


La franja horaria es GMT +2. Ahora son las 10:44:06.


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
Copyright 1996-2007 Club Delphi