DecodeByteArray y copyPixelsToBuffer no funcionan. SkImageDecoder :: Factory devuelto null
Tengo una clase TouchPoint que implementa Serializable y porque contiene Bitmap escribí writeObject y readObject para esa clase:
private void writeObject(ObjectOutputStream oos) throws IOException { long t1 = System.currentTimeMillis(); oos.defaultWriteObject(); if(_bmp!=null){ int bytes = _bmp.getWidth()*_bmp.getHeight()*4; ByteBuffer buffer = ByteBuffer.allocate(bytes); _bmp.copyPixelsToBuffer(buffer); byte[] array = buffer.array(); oos.writeObject(array); } Log.v("PaintFX","Elapsed Time: "+(System.currentTimeMillis()-t1)); } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{ ois.defaultReadObject(); byte[] data = (byte[]) ois.readObject(); if(data != null && data.length > 0){ _bmp = BitmapFactory.decodeByteArray(data, 0, data.length); } }
El problema es que me
- Uso de parceler (@Parcel) con Realm.io (Android)
- ¿Un objeto serializable siempre se serializa cuando se pone en un paquete?
- Cómo pasar un socket Bluetooth a otra actividad mediante la interfaz de la aplicación
- Cómo detener ProGuard de eliminar la interfaz Serializable de una clase
- Downcasting de Serializable a LinkedList <Class>
SkImageDecoder :: Factory devuelto null
Entonces, ¿cómo puedo solucionarlo. Sé que la posible solución es cambiar writeObject () a
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); _bmp.compress(Bitmap.CompressFormat.PNG, 100, byteStream); oos.writeObject(byteStream.toByteArray);
PERO este método es más lento casi 10+ veces.
- CopyPixelsToBuffer ~ 14ms para escribir la imagen
- _bmp.compress ~ 160ms
ACTUALIZACIÓN Descubre que el verdadero problema es que después de
buffer.array();
Todos los elementos del array byte [] son: 0
- ¿Puedo enviar objetos personalizados a Android Wear?
- Se produce ClassCastException en onRestoreInstanceState
- Problema serializable de Android
- ¿Está utilizando Serializable en Android mal?
- Android: Cualquier acceso directo a Serializable de Parcelable sin usar marshall ()?
- Pasar argumento entre Actividades - nulo
- Android ArrayList de objetos personalizados - Guardar en SharedPreferences - Serializable?
- Estado de restauración después de que el proceso se destruye
Finalmente encuentro una manera de hacer que funcione y sea más rápido al mismo tiempo. Me encontré dos problemas con este método:
- Debería pasar el parámetro Bitmap.Config también, sin que no pueda decodificar el array de bytes
- _bmp.compress y _bmp.copyPixelsToBuffer dar diferentes matrices por lo que no podía utilizar decodeByteArray.
Los solucioné de esta manera
private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); if(_bmp!=null){ int bytes = _bmp.getWidth()*_bmp.getHeight()*4; ByteBuffer buffer = ByteBuffer.allocate(bytes); _bmp.copyPixelsToBuffer(buffer); byte[] array = new byte[bytes]; // looks like this is extraneous memory allocation if (buffer.hasArray()) { try{ array = buffer.array(); } catch (BufferUnderflowException e) { e.printStackTrace(); } } String configName = _bmp.getConfig().name(); oos.writeObject(array); oos.writeInt(_bmp.getWidth()); oos.writeInt(_bmp.getHeight()); oos.writeObject(configName); } else { oos.writeObject(null); } } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{ ois.defaultReadObject(); byte[] data = (byte[]) ois.readObject(); if (data != null) { int w = ois.readInt(); int h = ois.readInt(); String configName = (String) ois.readObject(); Bitmap.Config configBmp = Bitmap.Config.valueOf(configName); Bitmap bitmap_tmp = Bitmap.createBitmap(w, h, configBmp); ByteBuffer buffer = ByteBuffer.wrap(data); bitmap_tmp.copyPixelsFromBuffer(buffer); _bmp = bitmap_tmp.copy(configBmp,true); bitmap_tmp.recycle(); } else { _bmp = null; } }
Esto es bastante rápido para mí – sobre 15x más rápidamente entonces la manera de bmp.compress. espero que esto ayude 🙂
Bitmap a byte []:
Bitmap bmp; // your bitmap ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray();
Utilice Bufferedstreams para un mejor rendimiento.
- Comprueba si la aplicación está disponible en Android Market
- ¿Cómo puedo convertir la entrada de Facebook created_time a la zona horaria del usuario?