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

MIDP 2.0 影像像素級處理 (四):單一圖片動態變色技術

     編輯:Java 相關知識

應用場景

遊戲開發中常需同一張圖片呈現不同顏色 (如角色換色、狀態變化)。MIDP 1.0 需準備多張圖片增加 JAR 體積,MIDP 2.0 透過 Image.getRGB() / Graphics.drawRGB() 可即時像素運算產生 N 種變體。

核心原理:ARGB 像素操作

每個像素為 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 通道循環置換後的變色效果。開發者可依需求設計更複雜的色彩轉換演算法 (如色相旋轉、飽和度調整、調色板映射)。

擴充應用

  • 角色換裝/換色: 基礎圖層 + 色彩遮罩
  • 狀態視覺化: 中毒變綠、冰凍變藍、燃燒變紅
  • 調色板動畫: 循環色表產生發光、閃爍效果
  • 記憶體優化: 一張圖片替代多張,大幅減小 JAR 體積

系列文章:(一) 半透明 | (二) 漸變透明動畫 | (三) 灰階轉換 | (四) 動態變色

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved