目標是將Bitmap
轉換爲byte []
,在數據的Bundle
的活動之間傳遞它,然後在稍後階段將其重新轉換回Bitmap
用於在Imageview
中顯示。Android:位圖到字節數組和返回:SkImageDecoder :: Factory返回null
的問題是,每當我試試這個,我只是得到一個空的位圖和非描述性的,無益的日誌輸出:
12-07 17:01:33.282: D/skia(2971): --- SkImageDecoder::Factory returned null
我已經看過了以下解決方案:
Solution supplies the bitmap to byte[] code used
Highlighted that copyPixelsToBuffer() is essential over .compress
(特別看到,因爲它是正在這種情況下是必要的)。
我已經運行了下面的測試用例,它肯定會將問題縮小到轉換和還原代碼。根據我的調試,有正確解碼,字節數組的大小正確和完整的,位圖CONFIGS被迫相同,decodeByteArray
只是失敗:
package com.example.debug;
import java.nio.ByteBuffer;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
RelativeLayout rl = null;
RelativeLayout.LayoutParams rlp = null;
ImageView ivBef = null;
ImageView ivAft = null;
Bitmap bmBef = null;
Bitmap bmAft = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TEST
BitmapFactory.Options bmo = new BitmapFactory.Options();
bmo.inPreferredConfig = Config.ARGB_8888;
bmBef = BitmapFactory.decodeFile("/mnt/sdcard/Debug/001.png", bmo);
byte[] b = bitmapToByteArray(bmBef);
bmAft = BitmapFactory.decodeByteArray(b, 0, b.length, bmo);
LinearLayout ll = new LinearLayout(this);
ivBef = new ImageView(this);
ivBef.setImageBitmap(bmBef);
ivAft = new ImageView(this);
ivAft.setImageBitmap(bmAft);
ll.addView(ivBef);
ll.addView(ivAft);
setContentView(ll);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public static byte[] bitmapToByteArray(Bitmap bm) {
// Create the buffer with the correct size
int iBytes = bm.getWidth() * bm.getHeight() * 4;
ByteBuffer buffer = ByteBuffer.allocate(iBytes);
// Log.e("DBG", buffer.remaining()+""); -- Returns a correct number based on dimensions
// Copy to buffer and then into byte array
bm.copyPixelsToBuffer(buffer);
// Log.e("DBG", buffer.remaining()+""); -- Returns 0
return buffer.array();
}
}
的前Imageview
正確顯示圖像時, ImageView
顯示什麼後(如你要做一個空位圖
我覺得問題不是佈局中的位圖問題。 –
問題是(如參考問題所示),與僅複製像素相比,壓縮顯然較慢。我可以理解這些好處,但是在處理小圖標圖像時,它似乎是不必要的開銷。 decodeByteArray只是錯誤的函數調用,因爲圖像在放入數組時未被「編碼」/壓縮? –
@BT請看我的回答,如果我的回答對你有幫助,那麼請接受它。 –