Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-01-2008
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
Bitmap a texto y texto a bitmap

Hola, he hecho un juego online en el que toda la comunicación se hace envíando cadenas de texto.

Ahora me gustaría poder enviar un TImage el cual siempre será un bitmap de 36 x 36 pixels y 256 colores. Pero no quería tocar el online del juego, me gustaría pasar el bitmap a una cadena de texto y enviarla. Cuando la reciba el otro jugador hay que convertirlo de nuevo a un bitmap, sabiendo que será un TImage de 36 x 36 pixels y 256 colores.

Me he fijado que si miras un form en formato texto los componentes TImage los pone como cadena con una propiedad Picture.Data
Código:
  
object Image1: TImage
    Left = 108
    Top = 68
    Width = 36
    Height = 36
    AutoSize = True
    Picture.Data = {   07544269746D61704609..... }
end
pero esta propiedad Picture.Data no existe, solo es para hacer el form.

También he probado a forzar el tipo Image1.Picture as String ó Image1.Picture.Bitmap as String pero no funciona.

¿ Alguna forma de hacerlo para poder envíar online la imagen como una cadena de texto ?

Gracias
Responder Con Cita
  #2  
Antiguo 09-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
El editor de formularios de delphi almacena una representación hexadecimal de los datos del componente (propiedad data). Podrías hacer lo mismo, o también usar un codificador/decodificador como los que vienen con las INDY, que hacen justamente eso. Representan cualqueir objeto binario en texto y lo inverso.

Estos métodos se inventaron para transmitir datos binarios sobre protocolos basados en texto, como el caso de SMTP (envío de correos) y se siguen utilizando hoy en día.

TidEncoderMIME/TidDecoderMIME (base64)
TidEncoderUUE/TidDecoderUUE
TidEncoderQuotedPrintable/TidDecoderQuotedPrintable

Cito la ayuda de la clase base para estos componentes, TidEncoder

Cita:
Empezado por indy help
Declaration
TIdEncoder = class(TIdBaseComponent)
Summary
Ancestor for Indy encoder classes.
Description
TIdEncoder is a TIdBaseComponent descendant that is the ancestor for Indy classes that perform encoding operations on String- or Stream-based values, and returns the encoded value as a String value.
Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 09-01-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Ademas de lo dicho por jachguate puedes usar las funciones que describo aqui:

http://delphi.jmrds.com/?q=node/43

Con ellas podrás convertir un Stream en un String y luego hacer el proceso inverso, y junto con los métodos SaveToStream y LoadFromStream del TBitmap son todo lo que necesitas.
Responder Con Cita
  #4  
Antiguo 09-01-2008
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
Gracias a los dos por contestar.

Primero he estado mirando los componentes de Indy, pero no acabo de aclararme y no he encontrado ningún ejemplo.

Luego he probado las funciones de seoane, que es justo lo que buscaba, pero tengo un problema al recuperar el TBitmap desde el stream.

He hecho una prueba rápida:
Código Delphi [-]
     Stream1 := TMemoryStream.Create;
     Image1.Picture.Bitmap.SaveToStream(Stream1);
     Texto:= BinToStr(Stream1.Memory,Stream1.Size);
     Stream2 := TMemoryStream.Create;
     StrToStream(Texto,Stream2);
     Image2.Picture.Bitmap.LoadFromStream(Stream2);

Inicialmente las dos imágenes (TImage) tienen cargada una imagen del mismo tamaño y formato, pero son distintas, para ver si me copia el contenido de la imagen1 en la imagen2. Cuando lo pruebo la imagen2 se queda vacia, transparente.

El problema está en el Image2.Picture.Bitmap.LoadFromStream() porque he probado a cargar el stream1 y me pasa el mismo problema.

¿Hay que preparar el TBitmap o el TImage de alguna manera para que cargue bien desde el stream ?

Una vez cargada la imagen desde el strem he porbado a hacer un Image2.Rapaint, Image2.Update... pero sigue transparente.

Saludos
Responder Con Cita
  #5  
Antiguo 09-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por kotai Ver Mensaje
Primero he estado mirando los componentes de Indy, pero no acabo de aclararme y no he encontrado ningún ejemplo.
Básicamente, creas una instancia del Encoder/Decoder y luego llamás al método correspondiente (Encode que recibe un stream y devuelve un string y Decode que recibe un string y devuelve un stream).

Pero si te vale lo de seoane, creo que puede resultar mas simple, aunque menos orientado a objetos

Cita:
Empezado por kotai Ver Mensaje
Luego he probado las funciones de seoane, que es justo lo que buscaba, pero tengo un problema al recuperar el TBitmap desde el stream.
Esto lo digo sin probarlo, pero se me ocurre que quizás Picture no esté preparado para que el bitmap contenido en ella se lea desde un stream.

Probá con esto:

Código Delphi [-]
  Stream1 := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(Stream1);
  Texto:= BinToStr(Stream1.Memory,Stream1.Size);
  Stream2 := TMemoryStream.Create;
  StrToStream(Texto,Stream2);
  Bitmap1 := TBitmap.Create();
  try   
    Bitmap1.LoadFromStream(Stream2);
    Image2.Picture := Bitmap1;
  finally
    Bitmap1.Free;
  end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 09-01-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por jachguate Ver Mensaje
Pero si te vale lo de seoane, creo que puede resultar mas simple, aunque menos orientado a objetos
Hago lo que puedo

Por otro lado, antes del LoadFromStream nunca viene mal colocar la posición del stream a cero:
Código Delphi [-]
Stream2.Position:= 0;
Por lo demás, la solución de jachguate me parece impecable.
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
stringGrid y bitmap cacu OOP 2 24-10-2007 18:11:03
Bitmap javikanin Gráficos 1 22-11-2004 13:32:15
Imagen a Bitmap bustio .NET 1 08-11-2004 14:29:19
Descargar bitmap... craven Gráficos 1 13-09-2003 13:27:22
propiedad bitmap ccampoy OOP 1 29-06-2003 22:16:17


La franja horaria es GMT +2. Ahora son las 12:29:14.


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