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

J2ME 透明圖片處理完全指南:從可變圖片到 Alpha 通道實現

     編輯:J2ME

J2ME 遊戲開發中,透明圖片是剛需。Sprite 載入 PNG 可自動處理透明,但若需「程序繪製圖形再套用透明背景」,則需手動操作像素數組。本文詳細講解 Image.createRGBImage 配合 getRGB 實現自定義透明圖片的完整流程,並提供可復用工具方法。

核心難點

  • createRGBImage(int[], w, h, true) 產生的**不可變圖片**支援 Alpha,但無法取得 Graphics 進行程序繪製。
  • createImage(w, h) 產生的**可變圖片**可取得 Graphics 繪圖,但不支援透明。

解決思路:先在可變圖片上繪製 → getRGB 取像素陣列 → 將指定背景色的高位設為 0x00(全透明)或 0xAA(半透明) → createRGBImage 產出最終不可變透明圖片。

完整實現步驟

1. 建立可變圖片並繪製內容

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); // 繪製紅色方塊

2. 取得像素陣列

int[] imgData = new int[w * h];
bufImg.getRGB(imgData, 0, w, 0, 0, w, h);

3. 將白色背景設為全透明(高位 0x00)

for (int i = 0; i < imgData.length; i++) {
    // imgData[i] 格式:0x00RRGGBB(可變圖片無 Alpha)
    if ((imgData[i] & 0x00FFFFFF) == 0x00FFFFFF) { // 匹配白色
        imgData[i] = imgData[i] & 0x00FFFFFF; // 高位清零 → 0x00FFFFFF(全透明白)
    }
}

4. 建立最終透明圖片

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 通常等於圖片寬度。
  • 大圖片像素陣列佔記憶體(w×h×4 bytes),注意堆疊限制,用完可將陣列設 null 協助 GC。
  • 僅支援 MIDP 2.0+(createRGBImage 為 MIDP 2.0 新增)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved