2014-03-04 42 views
3

我通過套接字在字節數組中接收到一個位圖,然後我讀取它,然後我想在我的應用程序中將它設置爲os.toByteArrayImageView。我使用的代碼是:RuntimeException:緩衝區不夠大像素

try { 
    //bmp = BitmapFactory.decodeByteArray(result, 0, result.length); 
    bitmap_tmp = Bitmap.createBitmap(540, 719, Bitmap.Config.ARGB_8888); 
    ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray()); 

    bitmap_tmp.copyPixelsFromBuffer(buffer); 
    Log.d("Server",result+"Length:"+result.length); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      imageView.setImageBitmap(bitmap_tmp); 
     } 
    }); 
    return bmp; 
} finally { 
} 

當我運行我的應用程序,並開始接收Byte[]並期待ImageView改變,事實並非如此。

logcat的說:

java.lang.RuntimeException: Buffer not large enough for pixels at 
android.graphics.Bitmap.copyPixelsFromBuffer 

我搜索類似的問題,但無法找到一個解決我的問題。

+0

什麼是您的Android操作系統版本? – MengMeng

+0

圖像字節與您的位圖(540x719)具有相同的維度嗎? – Henry

+0

您是否需要使用ByteBuffer.allocate設置緩衝區大小? – JamesB

回答

5

看看源爲Bitmap::copyPixelsFromBuffer()

錯誤的措詞(版本2.3.4_r1,最後一次是位圖之前的4.4更新Grepcode)是有點不清楚,但代碼clarifies--它意味着您的緩衝區計算爲沒有足夠的數據來填充位圖的像素。 這是(可能),因爲它們使用緩衝區的remaining()方法來計算緩衝區的容量,該緩衝區考慮了其position屬性的當前值。如果在調用copyFromPixels()之前調用緩衝區上的rewind(),則可能會看到運行時異常消失。我說'可能',因爲ByteBuffer :: wrap()方法應該將位置屬性值設置爲零,不需要調用倒帶,但通過類似的問題和我自己的經驗來明確地重置位置可能會訣竅。

嘗試

ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray()); 
buffer.rewind(); 
bitmap_tmp.copyPixelsFromBuffer(buffer); 
+1

沒有工作的傢伙。我的緩衝區大小= 921600.它仍然不夠? –