decodeByteArray и copyPixelsToBuffer не работают. SkImageDecoder::Factory вернул null

У меня есть класс TouchPoint который реализует Serializable и поскольку он содержит Bitmap, я написал writeObject и readObject для этого класса:

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);
    }
}

Проблема в том, что я получаю

SkImageDecoder::Factory возвращает значение null

Итак, как я могу это исправить. Я знаю, что возможным решением является изменение writeObject() на

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
_bmp.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
oos.writeObject(byteStream.toByteArray);

, НО этот метод медленнее почти в 10+ раз.

  • copyPixelsToBuffer ~14 мс для записи изображения
  • _bmp.compress ~ 160 мс

ОБНОВЛЕНИЕ Выясните, что реальная проблема заключается в том, что после

buffer.array();

все элементы массива byte[] имеют вид: 0

8
задан Cyberon 29 May 2012 в 08:26
поделиться