encodeByteArray和copyPixelsToBuffer无法正常工作。SkImageDecoder :: Factory返回null

【字号: 日期:2024-02-28浏览:41作者:雯心
如何解决encodeByteArray和copyPixelsToBuffer无法正常工作。SkImageDecoder :: Factory返回null?

最终,我找到了一种使其同时运行并更快的方法。使用此方法遇到两个问题:

我也应该通过Bitmap.Config参数,否则我无法解码字节数组_bmp.compress和_bmp.copyPixelsToBuffer给出了不同的数组,所以我不能使用解码字节数组。

我这样解决了

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

这对我来说足够快-比bmp.compress方式快15倍。希望这可以帮助 :)

解决方法

我有一个实现了Serializable的TouchPoint类,因为它包含位图,所以我为该类编写了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,data.length); }}

问题是我得到了

SkImageDecoder :: Factory返回null

那么我该如何解决。我知道可能的解决方案是将writeObject()更改为

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

但是这种方法要慢10倍以上。

copyPixelsToBuffer〜14ms用于写入图像_bmp.compress〜160ms

更新 发现实际的问题是

buffer.array();

所有byte []数组元素均为:0

相关文章: