2011-06-29 15 views
5

Es el código simple y en lugar de obtener el resultado para establecer el mapa de bits, obtengo nulo. ¿Alguien puede decirme dónde estoy cometiendo un error?¿Por qué BitmapFactory.decodeByteArray devuelve nulo?

String test = "test"; 
byte[] byteA = test.getBytes(); 
Bitmap bmp = BitmapFactory.decodeByteArray(byteA, 0, byteA.length); //<- I get null here 
ImageView image = (ImageView) findViewById(R.id.image); 
image.setImageBitmap(bmp); 

ACTUALIZACIÓN

Ok, así que no puede convertir el texto en la imagen como pensé que pude. ¿Qué hay de esta manera? ¿Esto creará un mapa de bits?

Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setColor(Color.RED); 
    paint.setTextSize(16); 
    paint.setAntiAlias(true); 
    paint.setTypeface(Typeface.MONOSPACE); 

    Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ALPHA_8); 
    float x = bm.getWidth(); 
    float y = bm.getHeight(); 
    Canvas c = new Canvas(bm); 
    c.drawText("Test", x, y, paint); 

Respuesta

17

De the documentation:

Returns The decoded bitmap, or null if the image could not be decode.

Los bytes que intervienen en la cadena "prueba" no son un mapa de bits válidos, ¿verdad?

si guardó el texto "prueba" en un archivo llamado foo.png o foo.jpg etc y trató de abrirlo en Windows, qué se puede esperar que el resultado sea? Sería un error: esos bytes simplemente no son una imagen válida en cualquier formato conocido.

EDITAR: No sé nada acerca de los gráficos de Android, pero su actualización ciertamente parece como una forma mucho más razonable de dibujar texto en un mapa de bits.

+0

Lo sé. Lo he leído :). Quise decir, ¿por qué no crea mapa de bits? ¿Dónde está el error en el código? – sandalone

+0

La cadena "prueba" es '74657374' en hexadecimal. Estás tratando de renderizar eso como un mapa de bits. No es uno. – yep

+3

@askmoo: El error está en tratar de leer cuatro bytes como si fueran una imagen. ¿En qué formato de imagen cree que están esos bytes? PNG? JPEG?¿Qué esperarías de la imagen? Tenga en cuenta que * no * está cargando un archivo llamado "prueba" o algo por el estilo ... solo está tratando de crear una imagen a partir de los bytes que representan la cadena "prueba" en la codificación predeterminada de la plataforma. –

4

Porque los bytes en "test".getBytes()no representan un mapa de bits válido.

Necesita crear una matriz de bytes que en realidad contenga un mapa de bits codificado, no solo algunos "bytes aleatorios" correspondientes a la representación de una cadena.

+0

Entonces, ¿cómo convertir String en byte [] -> byte [] en Image? Pensé que esta era la manera de hacerlo. – sandalone

+2

@askmoo: ¿Qué esperarías de la imagen? Una imagen de la palabra "prueba"? Realmente no está claro lo que estás tratando de hacer ... –

+0

@Skeet Estás en lo cierto. He editado el código y pegaré el nuevo código pronto. Gracias – sandalone

3

Está intentando analizar un String como un mapa de bits. BitmapFactory.decodeByteArray() fallará a menos que haya un mapa de bits válido en la matriz de bytes. En este caso, no, por lo que devuelve nulo.

+0

Entonces, ¿cómo convertir Cadena en byte [] -> byte [] en Imagen? Pensé que esta era la manera de hacerlo. – sandalone

+2

Cree un 'Mapa de bits' usando' Bitmap bm = Bitmap.createBitmap(); 'luego cree un lienzo usando' Canvas c = new Canvas (bm); 'luego cree algo de texto en el lienzo usando' c.drawText() '. El mapa de bits contendrá su texto. Es posible que necesite buscar algunos tutoriales en 'Canvas' si no está familiarizado con él. –

+1

En realidad, no tiene una cadena que se correlacione con una imagen. ¿Quiere decir, cargar un archivo, basado en un nombre que tiene en un 'String'? – yep

1

En tal caso, primero necesita convertir la cadena en Base64. gama

String strImage = geTImageAsHexString(); 
byte[] x = Base64.decode(strImage, Base64.DEFAULT); //convert from base64 to byte array 
Bitmap bmp = BitmapFactory.decodeByteArray(x,0,x.length); 
+0

funcionó para mí ... – GAMA

1

byte de datos de imagen comprimida - ¿qué es esto y cómo es diferente de los datos byte [] = new byte [SZ]?

¡Nadie hasta ahora ha dado una respuesta clara! Todo lo que la gente ha estado hablando es que hay un mapa de bits no válido. Una respuesta más informativa sería cómo crear una matriz de bytes válida en el nivel bajo

0

En mi caso, BitmapFactory.decodeByteArray devolvió nulo porque el búfer de la imagen recibida era incorrecto. Trate de ver el envío de búfer y el búfer entrante, estoy seguro de que verá la diferencia en dos matrices. La mayoría de las veces esta es la causa.

Cuestiones relacionadas