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

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

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:

  1. Debería pasar el parámetro Bitmap.Config también, sin que no pueda decodificar el array de bytes
  2. _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.

  • ¿Cómo poner un runnable en paquete?
  • Casting objetos a subclases de una superclase Parcelable?
  • Android: problema con objeto Serializable puesto en intención
  • Cómo pasar ArrayList <CustomeObject> de una actividad a otra?
  • Android: guarda datos parcelables en un archivo
  • Objeto serializable en la intención que devuelve como String
  • Persistencia de un objeto Parcelable en Android
  • Fragmento se bloquea con el paquete: no se puede marshal error de valor cuando onPause método se llama
  • ¿Cuál es la diferencia entre Parcelable y Serialization utilizado en android
  • Utilizar parcelable para almacenar el elemento como sharedferencias?
  • ArrayList no se puede convertir en clase personalizada extendiendo ArrayList
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.