J2ME 標準 API 無直接建立半透明圖片的方法,但可透過像素陣列操作實現。本文提供一個靜態工具方法,依指定透明度 (0-10 共 11 級) 產生半透明版本圖片。
import javax.microedition.lcdui.Image;
/**
* 產生半透明圖片
* @param src 來源圖片
* @param level 透明度等級 0-10 (0=全透明, 10=不透明)
* @return 新 Image 物件,輸入無效回傳 null
*/
public static Image createAlphaImage(Image src, int level) {
if (src == null) {
System.out.println("createAlphaImage: src is null");
return null;
}
// 邊界修正
if (level < 0) level = 0;
else if (level > 10) level = 10;
int w = src.getWidth();
int h = src.getHeight();
int[] rgb = new int[w * h];
// 取得原始像素 (0xAARRGGBB)
src.getRGB(rgb, 0, w, 0, 0, w, h);
// 計算目標 Alpha 值 (0-255)
int alpha = (level * 255) / 10;
// 建立遮罩:高 8 位為 alpha,低 24 位全 1 (保留 RGB)
int mask = (alpha << 24) | 0x00FFFFFF;
// 套用 Alpha:保留原 RGB,強制設定 Alpha
for (int i = 0; i < rgb.length; i++) {
rgb[i] = (rgb[i] & 0x00FFFFFF) | (alpha << 24);
// 等價於:rgb[i] &= mask; 但更明確
}
// 建立新圖片,processAlpha=true 關鍵!
return Image.createRGBImage(rgb, w, h, true);
}
alpha = level * 255 / 10,0→0, 5→127, 10→255rgb[i] & 0x00FFFFFF:清除原 Alpha,保留 RGB| (alpha << 24):寫入新 AlphaprocessAlpha=true,否則 Alpha 通道會被忽略
// 載入原圖
Image original = Image.createImage("/sprite.png");
// 產生 50% 半透明版本
Image halfAlpha = createAlphaImage(original, 5);
// 繪製時會自動混合背景
g.drawImage(halfAlpha, x, y, Graphics.TOP | Graphics.LEFT);
w*h*4 bytes 像素陣列 + 新 Image,大圖片請謹慎使用O(w*h) 迴路,建議在初始化階段預生成,避免渲染迴路中重複計算Hashtable 或陣列快取不同等級的結果,cache[level] 直接複用level 並重繪這個小工具方法雖簡單,卻是 J2ME 視覺特效庫的基石組件,掌握像素級 Alpha 操作能解鎖豐富的 UI 表現力。