Guarde la matriz de bytes de imagen en el servicio web .net y recupérela

Tengo un servicio web .net ASMX que estoy consumiendo usando la biblioteca ksoap2. En el servicio, primero guardo la imagen del usuario y luego la recupero. Sin embargo, una vez que lo recupero, la matriz de bytes está intacta, pero BitmapFactory no puede decodificarlo y devuelve un valor nulo.

Para convertir a matriz de bytes:

Bitmap viewBitmap = Bitmap.createBitmap(imageView.getWidth(),
imageView.getHeight(), Bitmap.Config.ARGB_8888);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
viewBitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
byte[] bitmapdata = bos.toByteArray();

El servicio web acepta el bytearray en formato byte[].

Para convertir la matriz en mapa de bits:

byte[] blob= info.get(Main.KEY_THUMB_BYTES).getBytes();
Bitmap bmp=BitmapFactory.decodeByteArray(blob,0,blob.length); // Return null :(
imageView.setImageBitmap(bmp);

Del análisis parcial, parece que la matriz de bytes no cambia. Entonces, ¿por qué la decodificación devuelve nulo? ¿Hay algo mejor para guardar una imagen y pasarla a través de un servicio web? No analicé toda la matriz de bytes, así que supongo que podría haber cambiado un poco.

¿Alguna idea? ¡Muchas gracias!

ACTUALIZACIÓN: Acabo de intentar convertir el byte[] en una cadena usando:

Base64.encodeToString( bos.toByteArray(), Base64.DEFAULT);

Y decodificar usando:

byte[] blob= Base64.decode(info.get(Main.KEY_THUMB_BYTES));

Ahora todo lo que obtengo es un Blanco imagen. No estoy seguro de lo que está mal aquí. Por favor ayuda.

ACTUALIZACIÓN: Estoy almacenando esta imagen dentro de una base de datos, en una columna de tipo varchar (máx.). ¿Debería almacenar esta cadena de matriz de bytes dentro de un tipo de datos SQL diferente? No tengo mucha experiencia con SQL, así que usé varchar porque no convertía el texto a Unicode, lo que pensé que podría ser bueno para la matriz de bytes.

¡Gracias!

preguntado el 01 de julio de 12 a las 04:07

1 Respuestas

convierta sus matrices de bytes a Base64 que es una cadena y fácil de transferir:

public static String bitmapToBase64(Bitmap bitmap) {
        byte[] bitmapdata = bitmapToByteArray(bitmap);
        return Base64.encodeBytes(bitmapdata);
    }

    public static byte[] bitmapToByteArray(Bitmap bitmap) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
        byte[] bitmapdata = bos.toByteArray();
        return bitmapdata;
    }

y

public static Bitmap base64ToBitmap(String strBase64) throws IOException {
    byte[] bitmapdata = Base64.decode(strBase64);
    Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0,
            bitmapdata.length);
    return bitmap;
}

también puede hacerlo no solo en archivos de imagen sino también en todos los tipos de archivos:

public static String fileToBase64(String path) throws IOException {
    byte[] bytes = fileToByteArray(path);
    return Base64.encodeBytes(bytes);
}

public static byte[] fileToByteArray(String path) throws IOException {
    File imagefile = new File(path);
    byte[] data = new byte[(int) imagefile.length()];
    FileInputStream fis = new FileInputStream(imagefile);
    fis.read(data);
    fis.close();
    return data;
}


public static void base64ToFile(String path, String strBase64)
        throws IOException {
    byte[] bytes = Base64.decode(strBase64);
    byteArrayTofile(path, bytes);
}

public static void byteArrayTofile(String path, byte[] bytes)
        throws IOException {
    File imagefile = new File(path);
    File dir = new File(imagefile.getParent());
    if (!dir.exists()) {
        dir.mkdirs();
    }
    FileOutputStream fos = new FileOutputStream(imagefile);
    fos.write(bytes);
    fos.close();
}

Respondido 01 Jul 12, 06:07

Intenté lo que me dijiste, y todavía obtengo una imagen blanca. Me pregunto si esto tiene algo que ver con el servicio web o la base de datos. Estoy almacenando la imagen como varchar (max), ¿debería usar un tipo diferente? - harsimranb

¿El valor de base64 que se envía al servicio web es el mismo que el valor de base64 que se recibe de él? - bobs

bueno, parece.... Se ve casi igual, pero no lo he comparado precisamente porque es bastante grande.... Puedo confirmarlo en unos minutos....... - harsimranb

@ Pathachiever11 Tengo el mismo problema... mira esta pregunta stackoverflow.com/questions/14681643/… - Pragnani

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.