首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java ImageView 陣列轉 Bitmap:正確用法是取得 ImageView 再獲取 Drawable

     編輯:程式設計綜合問答

錯誤嘗試


private Integer[] ImgId = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4 };
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), ImgId[index]); // ❌ 編譯錯誤:ImgId[index] 是 Integer,非資源 ID 常數

正確做法:兩步驟

  1. 根據索引取得 ImageView 實例。
  2. 從 ImageView 取得 Drawable 再轉 Bitmap。

// 1. 取得 ImageView(假設佈局中已有對應 id 的 ImageView)
ImageView imageView = findViewById(ImgId[index]); // ❌ 錯誤:ImgId 是 drawable 資源 ID,非 View ID

// 正確:View ID 與 Drawable ID 分離
private int[] viewIds = { R.id.img1, R.id.img2, R.id.img3, R.id.img4 };
private int[] drawableIds = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4 };

ImageView iv = findViewById(viewIds[index]);
iv.setImageResource(drawableIds[index]); // 如需動態設定

// 2. 從 ImageView 取得 Bitmap
Drawable drawable = iv.getDrawable();
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
    bitmap = ((BitmapDrawable) drawable).getBitmap();
} else {
    // VectorDrawable 或其他類型需繪製到 Canvas
    bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
}

若僅需從資源 ID 直接解碼 Bitmap


Bitmap bitmap = BitmapFactory.decodeResource(getResources(), drawableIds[index]);
// 可加入 Options 控制 inSampleSize 避免 OOM

關鍵區別

需求方法
從資源 ID 直接載入 BitmapBitmapFactory.decodeResource(res, drawableId)
從已顯示的 ImageView 取得當前 Bitmap(含縮放、濾鏡)imageView.getDrawable() → BitmapDrawable.getBitmap()
動態設定 ImageView 圖片imageView.setImageResource(drawableId) 或 setImageBitmap(bitmap)

不要混淆 R.drawable.xxx(資源 ID)與 R.id.xxx(View ID),兩者整數值域完全不同。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved