2012-01-04 18 views
7

Aquí está mi situación:conseguir la imagen de la matriz de bytes en el objeto JSON para aplicación Android

Tengo un servicio de WCF REST corriendo en mi servidor, el servicio está destinado a obtener varios tipos de datos sobre personas de una base de datos y marcas esos datos disponibles como un solo objeto JSON. ¡Funciona genial!

[EDITAR] Hay otro servicio que mantiene una memoria caché de imágenes en el sistema de archivos del servidor. Cuando se envía una solicitud al servicio RESTful, ese servicio solicita una imagen del servicio de imágenes. Si la imagen ya está en la memoria caché (el mismo ancho, alto y persona que la solicitud), la devuelve (como una matriz de bytes). DEBEMOS usar este servicio para recuperar imágenes.

Ahora lo que quiero es la imagen de esa persona. En nuestra base de datos, la imagen es una cruda larga (ew). Sin embargo, ya he tratado ese tema (párrafo anterior). La imagen ahora es una matriz de bytes. Soy bastante nuevo en Android y no estoy seguro de cuál es la mejor manera de recuperar esta imagen. Lo que pensé que podía hacer era agregar la matriz de bytes al objeto JSON y luego usar el decodificador base64 para convertirlo en una imagen dibujable. Sin embargo, cada vez que lo intento, se agota y me dice que esperaba ',' o ']' en algún índice arbitrario del búfer char para el objeto JSON.

He podido extraer los pequeños bits de datos del objeto JSON sin problemas, pero ahora que hay una gran matriz de bytes, el JSONObject me odia. ¿Cuál sería una mejor manera de obtener esta imagen de mi servicio?

Respuesta

10
  1. Base64 codifica la matriz de bytes para obtener una cadena.
  2. Agregue la cadena al objeto JSON y envíela.
  3. Cuando se recibe JSON, salga de la cadena.
  4. Base64 decodifícalo para recuperar la matriz de bytes.
  5. Usa la matriz de bytes para crear la imagen.
+0

creo que es lo que estaba buscando. –

+0

Creo que es una mejor manera: http://stackoverflow.com/a/15929125/245460 –

0

Consulte esta pregunta en storing images, siempre es mejor almacenar este tipo de datos en el sistema de archivos. Si es posible, desestime ese campo y cree una secuencia de comandos para mover las imágenes existentes al sistema de archivos.

A continuación, debe almacenar las imágenes en un sistema de archivos (o algún tipo de sistema de gestión de contenido) que se puede recuperar mediante una URL.

Luego, almacene la URL en la base de datos. a continuación, puede enviar esto en su objeto json.

{ 
... 
    image_url:<url from database> 
... 
} 

Cuando el cliente lo reciba, realizará una llamada a esa URL y descargará la imagen.

Su cliente tendrá que hacer una llamada por separado para recuperar la imagen, pero en general es mejor que llenar su base de datos con datos binarios. Esto también puede funcionar a su favor si desea visualizar datos rápidamente mientras permite que la imagen se descargue en segundo plano.

+0

No es exactamente lo que quise decir, traté de aclarar un poco más. Verifica mi edición –

0

Mejor que el uso de la codificación Base64 es esta forma de devolver la corriente (de WCF RAW programming)

 

[OperationContract, WebGet] 
public Stream GetTestImage(Image image) 
{ 
    MemoryStream stream = new MemoryStream(); 
    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    stream.Position = 0; 
    WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; 
    return stream; 
} 
 
Cuestiones relacionadas