標籤雲

搜尋此網誌

2013/08/24

關於 BitmapFactory.Options

來整理一下 BitmapFactory.Options 的一些屬性
最後來介紹一下 Chet Haase 在 DevBytes 示範的 inBitmap 的用法

public boolean inJustDecodeBounds
若設為 true 則呼叫 BitmapFactory 的 decode 類方法時會回傳 null(不會有像素占用記憶體)
但 BitmapFactory.Options 的 out 類屬性(有以下三個: outWidth, outHeight, outMimeType) 會有值
所以可以用來查詢圖片原本的長寬訊息之類的

public int inSampleSize
若設定該屬性大於 1 則讀取 Bitmap 資料時會讀入較少的像素
但傳入的數值若不是 2 的次方,則會降為最接近的 2 的次方值(1 也是 2 的次方值呦)

public boolean inScaled
public int inDensity
public int inTargetDensity

這三個屬性是用來設定像素密度與縮放
如果 inScaled 是 true (預設) 且 inDensity 與 inTargetDensity 不為 0
則會依 inTargetDensity 來決定縮放比例
而若 inDensity 與 inTargetDensity 都為 0 則呼叫 decodeResource 相關的方法時會使用該 resource 原本的密度

public boolean inMutable
API 11 加入的屬性,用來設定 bitmap 是否可編輯

public Bitmap inBitmap
API 11 加入的屬性,用來改善同一個 ImageView 載入不同 bitmap 時占用太多記憶體以及 GC 的問題
圖片必須是 JPEG 或 PNG 格式

用法如下:
// 將 mBitmapOptions 跟 mCurrentBitmap 作為類別屬性以便稍後重用(bitmap 尺寸必須相同)
mBitmapOptions = new BitmapFactory.Options();

mBitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.imageIds[0], mBitmapOptions);
mCurrentBitmap = Bitmap.createBitmap(mBitmapOptions.outWidth, mBitmapOptions.outHeight, Bitmap.Config.ARGB_8888); //ARGB_8888 是 Bitmap.Config 的預設值

mBitmapOptions.inJustDecodeBounds = false;
mBitmapOptions.inBitmap = mCurrentBitmap;
mBitmapOptions.inSampleSize = 1; //bug, 必須設定 inSampleSize 才能 work

BitmapFactory.decodeResource(getResources(), R.drawable.imageIds[0], mBitmapOptions);
imageview.setImageBitmap(mCurrentBitmap);

// 換圖的demo code
mcurrentIndex = (mcurrentIndex + 1) % imageIds.length;

BitmapFactory.Options bitmapOptions = mBitmapOptions;
bitmapOptions.inBitmap = mCurrentBitmap; // 使用 BitmapOptions.inBitmap 以重用 bitmap

mCurrentBitmap = BitmapFactory.decodeResource( getResources(), imageIds[ mcurrentIndex ], bitmapOptions );
imageview.setImageBitmap( mCurrentBitmap);

相關資料:
YouTube - DevBytes: Bitmap Scaling
YouTube - DevBytes: Bitmap Allocation
developer.android.com - BitmapFactory.Options

沒有留言: