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

MIDP 2.0 圖片像素級操作:透明度漸變與顏色反轉實戰

     編輯:J2ME

MIDP 2.0 圖像處理新能力

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 體積。

案例一:透明度漸變(淡入效果)

核心邏輯:

  1. 載入原始圖像,取得像素陣列 srcRgb。
  2. 複製一份 shadowRgb,將所有 Alpha 歸零(完全透明)。
  3. 啟動執行緒,每幀將 shadowRgb 中每像素的 Alpha 向原始值遞增 1,呼叫 repaint()。
  4. 繪製時使用 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


案例二:顏色通道交換(紅↔藍、紅↔綠)

遊戲常見需求:同一角色圖像,透過顏色置換產生不同陣營單位。僅需一張原始圖,執行階段即時生成變體。

工具類 GraphicsUtil

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;
    }
}

Canvas 繪製三版本對比

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);
    }
}

效能與記憶體考量

  • 像素陣列大小 = 寬 × 高 × 4 bytes。240×320 圖像約 300 KB,雙緩衝約 600 KB,符合 MIDP 2.0 典型堆疊限制。
  • 逐像素迴圈在 Java 層屬解釋執行,大圖動畫建議降低幀率(如 10 FPS)或縮小圖像尺寸。
  • 若需高效能濾鏡,可考慮 JNI 或平台專屬 API(如 Nokia UI API)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved