J2ME 遊戲開發中,透明圖片是剛需。Sprite 載入 PNG 可自動處理透明,但若需「程序繪製圖形再套用透明背景」,則需手動操作像素數組。本文詳細講解 Image.createRGBImage 配合 getRGB 實現自定義透明圖片的完整流程,並提供可復用工具方法。
createRGBImage(int[], w, h, true) 產生的**不可變圖片**支援 Alpha,但無法取得 Graphics 進行程序繪製。createImage(w, h) 產生的**可變圖片**可取得 Graphics 繪圖,但不支援透明。解決思路:先在可變圖片上繪製 → getRGB 取像素陣列 → 將指定背景色的高位設為 0x00(全透明)或 0xAA(半透明) → createRGBImage 產出最終不可變透明圖片。
int w = 32, h = 24;
Image bufImg = Image.createImage(w, h); // 可變圖片
Graphics g = bufImg.getGraphics();
g.setColor(0xFFFFFF);
g.fillRect(0, 0, w, h); // 白色背景
g.setColor(0xFF0000);
g.fillRect(10, 10, 20, 20); // 繪製紅色方塊
int[] imgData = new int[w * h];
bufImg.getRGB(imgData, 0, w, 0, 0, w, h);
for (int i = 0; i < imgData.length; i++) {
// imgData[i] 格式:0x00RRGGBB(可變圖片無 Alpha)
if ((imgData[i] & 0x00FFFFFF) == 0x00FFFFFF) { // 匹配白色
imgData[i] = imgData[i] & 0x00FFFFFF; // 高位清零 → 0x00FFFFFF(全透明白)
}
}
Image immutableImg = Image.createRGBImage(imgData, w, h, true); // true=處理Alpha
繪製 immutableImg 到 Canvas 時,白色背景將完全透明,只顯示紅色方塊。
/**
* 將指定顏色轉為透明
* @param img 原始不可變圖片(或可變圖片先 getRGB)
* @param alphaColor 要透明化的顏色,格式 0x00RRGGBB
* @return 處理後的不可變透明圖片
*/
public static Image createAlphaImage(Image img, int alphaColor) {
int w = img.getWidth();
int h = img.getHeight();
int[] imgData = new int[w * h];
img.getRGB(imgData, 0, w, 0, 0, w, h);
for (int i = 0; i < imgData.length; i++) {
if ((imgData[i] & alphaColor) == alphaColor) {
imgData[i] = imgData[i] & alphaColor; // 保留 RGB,高位歸零
}
}
return Image.createRGBImage(imgData, w, h, true);
}
若需半透明(如 50% 透明度),將匹配像素的高位設為 0x80(即 imgData[i] = 0x80RRGGBB),而非清零。
getRGB 參數:(int[] rgb, int offset, int scanlength, int x, int y, int w, int h),scanlength 通常等於圖片寬度。null 協助 GC。createRGBImage 為 MIDP 2.0 新增)。