Ho un TouchPoint classe che implementa Serializable e perché contiene Bitmap ho scritto writeObject e readObject per quella classe:decodeByteArray e copyPixelsToBuffer non funzionano. SkImageDecoder :: Fabbrica restituito nulla
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);
}
}
Il problema è che ottengo
SkImageDecoder :: Fabbrica restituita null
Quindi, come posso risolvere il problema. So che possibile soluzione è quella di cambiare writeObject() per
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
_bmp.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
oos.writeObject(byteStream.toByteArray);
ma questo metodo è più lento di quasi 10+ volte.
- copyPixelsToBuffer ~ 14ms per la scrittura di un'immagine
- _bmp.compress ~ 160ms
UPDATE scoprire che il vero problema è che dopo
buffer.array();
Tutti byte [] gli elementi dell'array sono: 0
Non ricevi altri messaggi di errore? Forse, 'int bytes = _bmp.getRowBytes() * _bmp.getHeight()' risolverebbe il tuo problema. –
no, non ricevo altri messaggi. questo non ha risolto il problema. Tuttavia, trovo il modo di risolverlo. Pubblicherò una risposta più tardi. – Cyberon