常見 Bitmap 建立方式
| 來源 | 方法 | 範例 |
| RGB 字串 | Color.parseColor() + eraseColor() | createColorBitmap("#cce8cf", 200, 50) |
| Color 常數 | eraseColor(Color.BLUE) | createColorBitmap(Color.BLUE, 200, 50) |
| byte[] | BitmapFactory.decodeByteArray() | 網路下載後轉圖 |
| 檔案路徑 | BitmapFactory.decodeFile() | SD 卡圖片 |
| Resources | BitmapFactory.decodeResource() | APK 內置圖片 |
| InputStream | BitmapFactory.decodeStream() | 網路流、assets |
| Drawable | BitmapFactory.decodeResource() | 同上 |
Bitmap ↔ Drawable 互轉
// Drawable → Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.icon);
// Bitmap → Drawable
Drawable drawable = new BitmapDrawable(resources, bitmap);
圓角 Bitmap 產生器
public static Bitmap getRoundedCornerBitmap(Bitmap src, int radius) {
Bitmap output = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
paint.setAntiAlias(true);
Rect rect = new Rect(0, 0, src.getWidth(), src.getHeight());
RectF rectF = new RectF(rect);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(0xff424242);
canvas.drawRoundRect(rectF, radius, radius, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(src, rect, rect, paint);
return output;
}
radius:圓角半徑(像素),值越大越圓。
- 核心原理:先畫圓角矩形遮罩,再用
SRC_IN 模式只保留原圖與遮罩交集區域。
效能與記憶體提醒
BitmapFactory.decodeXxx 會完整解碼至記憶體,大圖請用 inSampleSize 縮放。
- 不再使用的
Bitmap 呼叫 recycle()(API 19+ 多由 GC 管理,但主動釋放更保險)。
- 頻繁建立圓角圖建議快取或使用
RoundedBitmapDrawableFactory (Support Library)。
Kotlin 擴充函數建議
fun Bitmap.rounded(radius: Int): Bitmap = BitmapUtils.getRoundedCornerBitmap(this, radius)
fun Int.toColorBitmap(w: Int, h: Int) = BitmapUtils.createColorBitmap(this, w, h)