遊戲開發中常需同一張圖片呈現不同顏色 (如角色換色、狀態變化)。MIDP 1.0 需準備多張圖片增加 JAR 體積,MIDP 2.0 透過 Image.getRGB() / Graphics.drawRGB() 可即時像素運算產生 N 種變體。
每個像素為 32 位整數:0xAARRGGBB (Alpha、Red、Green、Blue 各 8 位)
int r = (rgb[i] & 0x00FF0000) >> 16; // 取紅色通道
int g = (rgb[i] & 0x0000FF00) >> 8; // 取綠色通道
int b = rgb[i] & 0x000000FF; // 取藍色通道
int temp = r;
r = b;
b = g;
g = temp;
// 重組像素 (Alpha 保持 0xFF 不透明)
rgb[i] = ((r << 16) | (g << 8) | b) | 0xFF000000;
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class ColorSwapCanvas extends Canvas {
Image sourceImage;
int[] rgb;
public ColorSwapCanvas() {
try {
sourceImage = Image.createImage("/h.png"); // 載入原始圖片
} catch (IOException e) {
e.printStackTrace();
}
rgb = new int[sourceImage.getWidth() * sourceImage.getHeight()];
sourceImage.getRGB(rgb, 0, sourceImage.getWidth(), 0, 0,
sourceImage.getWidth(), sourceImage.getHeight());
// 像素變色處理
for (int i = 0; i < rgb.length; i++) {
int r = (rgb[i] & 0x00FF0000) >> 16;
int g = (rgb[i] & 0x0000FF00) >> 8;
int b = rgb[i] & 0x000000FF;
int temp = r;
r = b;
b = g;
g = temp;
rgb[i] = ((r << 16) | (g << 8) | b) | 0xFF000000;
}
}
protected void paint(Graphics g) {
// 繪製原圖 (參考)
g.drawImage(sourceImage, 0, 0, Graphics.TOP | Graphics.LEFT);
// 繪製變色後像素陣列 (位移顯示)
g.drawRGB(rgb, 0, sourceImage.getWidth(), 0, 60,
sourceImage.getWidth(), sourceImage.getHeight(), true);
}
}

左側為原圖,右側為 RGB 通道循環置換後的變色效果。開發者可依需求設計更複雜的色彩轉換演算法 (如色相旋轉、飽和度調整、調色板映射)。
系列文章:(一) 半透明 | (二) 漸變透明動畫 | (三) 灰階轉換 | (四) 動態變色