decodeByteArray and copyPixelsToBuffer not working. SkImageDecoder::Factory returned null

前端 未结 2 963
误落风尘
误落风尘 2020-12-30 11:42

I have a class TouchPoint which implements Serializable and because it contains Bitmap I wrote writeObject and readObject for that class:

private void writeO         


        
相关标签:
2条回答
  • 2020-12-30 11:48

    Bitmap to byte[]:

    Bitmap bmp; // your bitmap
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    

    Use Bufferedstreams for better performance.

    0 讨论(0)
  • 2020-12-30 12:09

    Finally I find a way to make it work and be faster at the same time. I was encountered two issues using this method:

    1. I should pass the Bitmap.Config param also, without that I can't decode the byte array
    2. _bmp.compress and _bmp.copyPixelsToBuffer give different arrays so I couldn't use decodeByteArray.

    I solved them this way

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

    This is enough fast for me - about 15x faster then the bmp.compress way. hope this helps :)

    0 讨论(0)
提交回复
热议问题