2012-02-22 55 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