2012-02-22 45 views
0

我有一个画布我画,我试图把位图,将其转换为一个字节数组,并将其保存到一个文件序列化。然后再打开,反序列化,并将位图应用回画布。在下面的代码中,除了在画布上应用位图时,一切看起来都不错。有人可以告诉我哪里出错了。画布位图到字节数组和读取它的麻烦

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 - Serializable类包含我的所有数据,简单的获取/设置有

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

回答

1

我会做以下2个测试。

  1. 记录一些字节流以确保其正确加载。像Log.v(canvasData[0]+canvasData[1]);之类的东西,或者在那里放一个断点,或者只是为了确保数据是正确的。
  2. 使用相同的代码绘制一个您知道有效的位图,看看它是否显示正确。

我不确定到底发生了什么,但我强烈怀疑以下情况之一。

  1. 字节流没有被正确读入。
  2. 位图没有被更新到屏幕,或正在使用一个平凡的小尺寸。

如果你的字节流数据有问题,那么你会想看看Canvas documentation.。具体来说,看看下面的一点。

为了看到一个画布,它必须放在一个视图。一旦它在视图中,必须调用onDraw()命令使其可见。我会确保你实际上正在做一个onDraw(),并且Canvas正确地与View关联。如果您已经使用onDraw(),请发布与它相关的代码位。

+0

首先感谢您的建议,结果是Log.v(canvasData [0] + canvasData [1]);是-11980,我不知道这意味着什么...... – 2012-02-22 18:53:42

+0

@KamilSalagan:这意味着字节流至少是有效的,我认为是这种情况。好像你的画布没有被更新。将发布更多笔记。 – PearsonArtPhoto 2012-02-22 19:01:44

+0

这就是有趣的,至少我知道它是好的,但为什么不画布更新?我在我的过程结束时调用invalidate()方法,并且我知道onDraw被调用,我有一个Log.v在那里输出到控制台。 – 2012-02-22 19:05:34