gpt4 book ai didi

java - decodeByteArray 和 copyPixelsToBuffer 不工作。 SkImageDecoder::Factory 返回空

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:14 25 4
gpt4 key购买 nike

我有一个 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 returned 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

最佳答案

最后,我找到了一种方法,使其既能运行又能更快。我在使用这种方法时遇到了两个问题:

  1. 我还应该传递 Bitmap.Config 参数,否则我无法解码字节数组
  2. _bmp.compress 和 _bmp.copyPixelsToBuffer 提供不同的数组,因此我无法使用 decodeByteArray。

我是这样解决的

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

这对我来说已经足够快了——比 bmp.compress 方式快大约 15 倍。希望这有帮助:)

关于java - decodeByteArray 和 copyPixelsToBuffer 不工作。 SkImageDecoder::Factory 返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com