德codeByteArray和copyPixelsToBuffer不工作。 SkImageDe codeR ::厂返回null [英] decodeByteArray and copyPixelsToBuffer not working. SkImageDecoder::Factory returned null
问题描述
我有一类接触点,它实现Serializable接口,并因为它包含了位图我写的writeObject和readObject该类:
I have a class TouchPoint which implements Serializable and because it contains Bitmap I wrote writeObject and readObject for that class:
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);
}
}
现在的问题是,我得到
The problem is that I get
SkImageDe codeR ::厂返回null
SkImageDecoder::Factory returned null
那么,如何解决这个问题。我知道,可能的解决办法是改变writeObject()将
So how can I fix it. I know that possible solution is to change writeObject() to
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
_bmp.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
oos.writeObject(byteStream.toByteArray);
但这种方法比较慢,几乎10+倍。
BUT this method is slower almost 10+ times.
- copyPixelsToBuffer〜14ms的写入图像
- _bmp.com preSS〜160毫秒
更新 找出实际的问题是,后
UPDATE Find out that the actual problem is that after
buffer.array();
所有的byte []数组元素:0
All byte[] array elements are: 0
推荐答案
最后,我找到一种方法,使工作和更快的同时。我遇到过使用这种方法的两个问题:
Finally I find a way to make it work and be faster at the same time. I was encountered two issues using this method:
- 我要通过Bitmap.Config参数也没有,我不能去code中的字节数组
- _bmp.com preSS和_bmp.copyPixelsToBuffer给出不同的阵列,所以我不能C $ cByteArray使用去$。
我解决了他们这样
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;
}
}
这是速度不够快,我 - 约15倍的速度,然后在bmp.com preSS方式。希望这有助于:)
This is enough fast for me - about 15x faster then the bmp.compress way. hope this helps :)
这篇关于德codeByteArray和copyPixelsToBuffer不工作。 SkImageDe codeR ::厂返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!