我有一个画布,我正在尝试将位图取出,将其转换为字节数组并将其序列化保存到文件中。然后打开,反序列化,并将位图应用回画布。在下面的代码中,除了将位图应用于画布时,一切似乎都运行良好。有人可以告诉我我哪里出错了。
public byte[] getCanvasData(){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mBitmap.compress(CompressFormat.PNG, 0, bos);
byte[] bitmapdata = bos.toByteArray();
return bitmapdata;
}
public void setCanvasData(byte[] canvasData, int w, int h){
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mBitmap.eraseColor(0x00000000);
mCanvas = new Canvas(mBitmap);
mCanvas.drawBitmap(BitmapFactory.decodeByteArray(canvasData , 0, canvasData.length).copy(Bitmap.Config.ARGB_8888, true), 0, 0, null);
}
添加了一些额外的代码,可能有点帮助
public void readInSerialisable() throws IOException
{
FileInputStream fileIn = new FileInputStream("/sdcard/theBKup.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
try
{
BookData book = (BookData) in.readObject();
pages.clear();
canvasContainer.removeAllViews();
for (int i = 0; i < book.getBook().size(); i++){
Log.d("CREATION", "LOADING PAGE " + i);
pages.add(new Canvas2(context, book.getPageAt(i), canvasContainer.getWidth(), canvasContainer.getHeight()));
}
canvasContainer.addView(pages.get(page), new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.FILL_PARENT, AbsoluteLayout.LayoutParams.FILL_PARENT, 0, 0));
updatePagination();
Log.d("CREATION", "Updated Pagination");
}
catch (Exception exc)
{
System.out.println("didnt work");
exc.printStackTrace();
}
}
BookData - 包含所有数据的可序列化类,其中包含简单的获取/设置
onDraw方法
@Override
protected void onDraw(Canvas canvas) {
Log.d("DRAWING", "WE ARE DRAWING");
canvas.drawColor(0x00AAAAAA); //MAKE CANVAS TRANSPARENT
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
答案 0 :(得分:1)
我会做以下两项测试。
Log.v(canvasData[0]+canvasData[1]);
这样的东西,或者在那里设置一个断点,或者只是为了确保数据是正确的。我不确定究竟发生了什么,但我强烈怀疑以下情况之一。
如果您的字节流数据有某些内容,那么您需要查看Canvas documentation.具体来说,请查看以下内容。
要查看Canvas,必须将其放在视图上。一旦在视图上,必须调用onDraw()
命令才能使其可见。我会确保你实际上正在做一个onDraw(),并且Canvas正确地与View相关联。如果您已经使用了onDraw(),请发布与其相关的代码。