MIDP 1.0 僅支援不可變圖像,若需像素級處理必須依賴廠商擴展 API。MIDP 2.0 大幅增強 Image 與 Graphics:
Image.getRGB(int[] rgbData, ...):取得像素陣列(ARGB 格式,0xAARRGGBB)。Graphics.drawRGB(int[] rgbData, ...):直接繪製像素陣列。Image.createRGBImage(int[] rgb, w, h, hasAlpha):從像素陣列建立新圖像。這使得透明度動畫、色調調整、特效濾鏡等純軟體實作成為可能,無需額外圖檔,節省 JAR 體積。
核心邏輯:
srcRgb。shadowRgb,將所有 Alpha 歸零(完全透明)。shadowRgb 中每像素的 Alpha 向原始值遞增 1,呼叫 repaint()。g.drawRGB(shadowRgb, ...) 即可看到淡入動畫。public class ShadowCanvas extends Canvas implements Runnable {
private Image srcImage;
private int[] srcRgb, shadowRgb;
private int imgW, imgH, count;
public ShadowCanvas() {
try { srcImage = Image.createImage("/av.png"); }
catch (IOException e) { e.printStackTrace(); }
imgW = srcImage.getWidth(); imgH = srcImage.getHeight();
srcRgb = new int[imgW * imgH];
srcImage.getRGB(srcRgb, 0, imgW, 0, 0, imgW, imgH);
shadowRgb = new int[srcRgb.length];
System.arraycopy(srcRgb, 0, shadowRgb, 0, shadowRgb.length);
// 全透明初始化
for (int i=0;i>> 24;
int targetAlpha = (srcRgb[i] & 0xFF000000) >>> 24;
if (alpha < targetAlpha) {
shadowRgb[i] = ((alpha+1) << 24) | (shadowRgb[i] & 0x00FFFFFF);
changed = true;
}
}
try { Thread.sleep(10); } catch (InterruptedException e) {}
count++; repaint();
if (!changed) { System.out.println("over"); break; }
}
}
}


遊戲常見需求:同一角色圖像,透過顏色置換產生不同陣營單位。僅需一張原始圖,執行階段即時生成變體。
public class GraphicsUtil {
public static final int SHIFT_RED_TO_GREEN = 0;
public static final int SHIFT_RED_TO_BLUE = 1;
// ... 其他常數略 ...
public static int[] flipImageColor(Image source, int shiftType) {
int w = source.getWidth(), h = source.getHeight();
int[] rgb = new int[w * h];
source.getRGB(rgb, 0, w, 0, 0, w, h);
for (int i=0;i> 24;
int r = (p & 0x00FF0000) >> 16;
int g = (p & 0x0000FF00) >> 8;
int b = (p & 0x000000FF);
int ba=a, br=r, bb=b, bg=g; // 備份
switch (shiftType) {
case SHIFT_RED_TO_GREEN: g = r; r = bg; break;
case SHIFT_RED_TO_BLUE: b = r; r = bb; break;
case SHIFT_GREEN_TO_BLUE: g = b; b = bg; break;
case SHIFT_GREEN_TO_RED: g = r; r = bg; break;
case SHIFT_BLUE_TO_RED: b = r; r = bb; break;
case SHIFT_BLUE_TO_GREEN: b = g; g = bb; break;
}
rgb[i] = (a<<24) | (r<<16) | (g<<8) | b;
}
return rgb;
}
}
public class ColorCanvas extends Canvas {
private Image srcImage;
private int[] img1, img2; // 兩種變體
public ColorCanvas() {
try { srcImage = Image.createImage("/av.png"); }
catch (IOException e) { e.printStackTrace(); }
img1 = GraphicsUtil.flipImageColor(srcImage, GraphicsUtil.SHIFT_RED_TO_BLUE);
img2 = GraphicsUtil.flipImageColor(srcImage, GraphicsUtil.SHIFT_RED_TO_GREEN);
}
protected void paint(Graphics g) {
g.setColor(0); g.fillRect(0,0,getWidth(),getHeight());
// 原圖
g.setColor(0x00FF00);
g.drawString("origin:", getWidth()/2, 0, Graphics.TOP|Graphics.HCENTER);
g.drawImage(srcImage, 30, 20, Graphics.LEFT|Graphics.TOP);
// 變體 1
g.drawString("SHIFT_RED_TO_BLUE:", getWidth()/2,
srcImage.getHeight()+20, Graphics.TOP|Graphics.HCENTER);
g.drawRGB(img1, 0, srcImage.getWidth(),
30, srcImage.getHeight()+40,
srcImage.getWidth(), srcImage.getHeight(), true);
// 變體 2
g.drawString("SHIFT_RED_TO_GREEN:", getWidth()/2,
srcImage.getHeight()*2+40, Graphics.TOP|Graphics.HCENTER);
g.drawRGB(img2, 0, srcImage.getWidth(),
30, srcImage.getHeight()*2+60,
srcImage.getWidth(), srcImage.getHeight(), true);
}
}