Android Bitmap 和 ByteArray的互相轉換
移動平台圖像處理,需要將圖像傳給native處理,如何傳遞?將bitmap轉換成一個 byte[]
方便傳遞也方便cpp代碼直接處理圖像內容。
Bitmap -> byte[]
創建一個ByteBuffer用於接收數據。首先需要爲buffer開辟內存空間,內存空間的大小就是圖片的大小。將bitmap的數據寫入buffer,然后調用buffer的 array()
方法得到array.
int bytes = bmp.getByteCount();
ByteBuffer buf = ByteBuffer.allocate(bytes);
bmp.copyPixelsToBuffer(buf);
byte[] byteArray = buf.array();
byte[] -> Bitmap
這個步驟讓我花費了更多時間。之前看到有人說可以使用
Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, bitmapdata.length);
來根據ByteArray直接得到bitmap,但是我使用中出現問題。想想其實很簡單,就這么一行語句,一個bitmap對象必須的參數都沒有設置,怎么就可能得到正常的bitmap對象?這個方法生效的前提是,提供的bitmapdata是包含了圖像參數的,而非簡單的RGBA數據。而我現在得到的僅僅是RGBA數據,所以需要先得到一個bitmap實例,再往里填數據。需要將得到的array再變回buffer,使用buffer的 wrap
方法,包裝數組得到buffer.
// use Bitmap.Config.ARGB_8888 instead of type is OK
Bitmap stitchBmp = Bitmap.createBitmap(width, height, type);
stitchBmp.copyPixelsFromBuffer(ByteBuffer.wrap(byteArray));
imageView.setImageBitmap(stitchBmp);
參考資料