`

j2me工具类:PalettedImage调色板类

    博客分类:
  • j2me
阅读更多
该方法网上可以找到,我添加了一个重载函数:
public Image getPalettedImage(String path, int[] originalColors,
int[] palettedColors)
三个参数依次为图片路径、需要改变的旧颜色值、新的颜色值,注意这2个参数都为数组,长度必须一致,这样可以一次改变多种颜色。

用法:
PalettedImage p=new PalettedImage();
Image newImage=p.getPalettedImage("/Humans121.png", new int[]{0x0000ff}, new int[]{0x00ff00});
...
g.drawImage(newImage, 0, 0, 0);

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.lcdui.Image;

public class PalettedImage {

	public Image getPalettedImage(String path, int[] originalColors,
			int[] palettedColors) {
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		try {
			is = getClass().getResourceAsStream(path);
			baos = new ByteArrayOutputStream();
			int ch = 0;
			while ((ch = is.read()) != -1) {
				baos.write(ch);
			}
		} catch (IOException ioe) {
			System.out.println(ioe);
		} finally {
			try {
				if (baos != null)
					baos.close();
				if (is != null)
					is.close();
			}
			catch (IOException e) {
				System.out.println(e);
			}
		}
		return getPalettedImage(baos.toByteArray(), originalColors,
				palettedColors);
	}
	/*
	 * 原始图片的byte数组,以及需要替换颜色的颜色值还有目标颜色值就行了。 因为可以同时替换多个颜色,所以输入参数是代表颜色的整形的数组。
	 * 总之,要保证原始颜色与目标颜色一一对应就好了
	 */
    public Image getPalettedImage(byte[] data, int[] originalColors,
            int[] palettedColors) {
        byte[] tempData = new byte[data.length];
        System.arraycopy(data, 0, tempData, 0, data.length);
        Image img = null;
        int[] parameter = { 0, 0, 0 };
        analyze(tempData, parameter);
        for (int i = 0; i < originalColors.length; i++) {
            replaceColor(tempData, parameter, originalColors[i],
                    palettedColors[i]);
        }
        fillData(tempData, parameter);
        try {
            img = Image.createImage(tempData, 0, data.length);
        } catch (Exception e) {
            System.out.println("getPalettedImage  &&  " + e.toString());
        }
        return img;
    }

    private void analyze(byte[] data, int[] para) {
        int offset = 8;
        int chunkLen = 0;
        while (data[offset + 4] != 0x50 || data[offset + 5] != 0x4c
                || data[offset + 6] != 0x54 || data[offset + 7] != 0x45) {
            chunkLen = readInt(data, offset);
            offset += (4 + 4 + chunkLen + 4);
        }
        chunkLen = readInt(data, offset);
        para[2] = chunkLen / 3;
        para[0] = offset + 8;
        para[1] = offset + 8 + chunkLen;
    }

    private int readInt(byte[] data, int offset) {
        return ((data[offset] & 0xFF) << 24)
                | ((data[offset + 1] & 0xFF) << 16)
                | ((data[offset + 2] & 0xFF) << 8) | (data[offset + 3] & 0xFF);
    }

    private void replaceColor(byte[] data, int[] para, int oldColor,
            int newColor) {
        byte rr = (byte) ((oldColor >> 16) & 0xff);
        byte gg = (byte) ((oldColor >> 8) & 0xff);
        byte bb = (byte) (oldColor & 0xff);
        for (int i = 0, offset = para[0], temp = 0; i < para[2]; i++, offset += 3) {
            if (rr == data[offset] && gg == data[offset + 1]
                    && bb == data[offset + 2]) {
                data[offset] = (byte) ((newColor >> 16) & 0xff);
                data[offset + 1] = (byte) ((newColor >> 8) & 0xff);
                data[offset + 2] = (byte) (newColor & 0xff);
                break;
            }
        }
    }

    private void fillData(byte[] data, int[] para) {
        int checksum = update_crc(data, para[0] - 4, para[2] * 3 + 4);
        data[para[1]] = (byte) ((checksum >> 24) & 0xff);
        data[para[1] + 1] = (byte) ((checksum >> 16) & 0xff);
        data[para[1] + 2] = (byte) ((checksum >> 8) & 0xff);
        data[para[1] + 3] = (byte) ((checksum) & 0xff);
    }

    private int update_crc(byte[] buf, int off, int len) {
        int c = 0xffffffff;
        int n, k;
        int xx;
        int[] crc_table = new int[256];
        for (n = 0; n < 256; n++) {
            xx = n;
            for (k = 0; k < 8; k++) {
                if ((xx & 1) == 1) {
                    xx = 0xedb88320 ^ (xx >>> 1);
                } else {
                    xx = xx >>> 1;
                }
            }
            crc_table[n] = xx;
        }

        for (n = off; n < len + off; n++) {
            c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>> 8);
        }
        return (c ^ 0xffffffff);
    }

}
分享到:
评论

相关推荐

    J2ME游戏编程:TP319:G899 W511.iso

    J2ME游戏编程:TP319:G899 W511.iso 随书光盘,欢迎大家下载 大家共享^A^

    J2ME实用教程:从入门到精通的所有ppt

    10. **调试与优化**:掌握使用J2ME的调试工具和技巧,以及如何优化代码以提高性能和电池寿命。 教程中的每个`.rar`文件可能代表不同的章节或主题,例如,日期可能是文件创建或更新的日期。通过逐步学习这些PPT,你...

    郭可华J2ME实战教程:ppt和对应源码

    **J2ME简介** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为嵌入式设备和移动设备设计。它提供了一种轻量级的、高效的环境来开发应用程序,如手机、电视、冰箱等智能家电以及各种手持设备。J2ME由一组...

    J2ME成品游戏:地心寻宝源码

    这个游戏是基于是男人就下100层的理念,这是本人在j2me开发的学习过程中的一点心得体会。本资源用JBuilder可直接打开,并且注释齐全。其中还有打好的jar包,可直接放入手机运行,分辨率为240*320,提供给大家学习...

    J2ME游戏代码:俄罗斯方块

    /* * 一个简单的俄罗斯方块游戏代码,代码中主要包含3个类: *TerrisMIDlet——MIDlet类 *GameCanvas——游戏界面类 *GameEngine——游戏逻辑类 *已经使用WTK2.5.2运行通过. */

    Android-development.rar_android_game android J2ME_site:en.pudn.c

    "android_game android J2ME site:en.pudn.c"这部分标签揭示了该资源可能包含的内容,即关于Android游戏开发的知识,以及可能与J2ME(Java 2 Micro Edition)平台的迁移或转换相关的指导。 【描述】提到的“$兩小時...

    分享:J2ME游戏代码(代码已经初级优化)

    分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME游戏代码 分享:J2ME游戏代码分享:J2ME游戏代码 分享:J2ME...

    jbuilder 2006 j2me ALERT: java/lang/ClassFormatError: Bad version information.

    这个错误表明Java虚拟机(JVM)遇到了一个它无法识别或者处理的类文件版本。在JBuilder 2006环境下开发J2ME应用时,如果你遇到了这个错误,可能是由于以下原因导致的: 1. **JDK版本不匹配**:JBuilder 2006可能与...

    J2ME教材:J2ME&Gaming中文版

    3. **MIDP API**:这是J2ME游戏开发的关键,包括Canvas类用于绘制游戏画面,Graphics对象进行图形绘制,以及键盘和触摸事件的处理。 4. **用户界面(UI)设计**:MIDP提供了一些基本的UI组件,如ChoiceGroup、...

    J2ME工具篇.rar

    **J2ME(Java 2 Micro Edition)工具篇** J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、PDA等。开发J2ME应用程序时,选择合适的工具至关重要,这些工具能够提升开发效率,简化调试过程,并...

    开发中j2me与android的比较.pdf

    - **J2ME**:通过 `Canvas` 类的 `getHeight()` 和 `getWidth()` 方法获取。 - **Android**:通过 `WindowManager.getDefaultDisplay()` 获取屏幕对象,然后调用 `getWidth()` 和 `getHeight()` 方法获取屏幕宽度...

    J2ME-Game:简单的J2ME游戏

    1. **Canvas类**:J2ME游戏通常基于Canvas类构建,这是一个可以进行图形绘制的空白画布。开发者可以重写Canvas的`paint()`方法来实现游戏的渲染。 2. **Graphics对象**:在Canvas上绘图使用Graphics对象,它可以...

    J2ME源码:连连看

    - MIDP GUI组件:J2ME中的用户界面主要通过Canvas类构建,Canvas是绘制自定义图形的基础类。此外,可能还会用到Form和Item等组件。 - LCDUI(Limited Conformance Display User Interface):这是MIDP的一部分,...

    j2me的一些工具类

    "j2me的一些工具类"这个压缩包可能包含了一些开发者自定义的实用工具类,这些类可以提高代码的复用性和可维护性。 首先,让我们了解一下J2ME的基本结构。J2ME通常由配置(Configuration)、特性(Profile)和包...

    J2ME源码:五子棋

    J2ME中的键盘和触摸事件处理通常基于 MIDP 的Command和GameCanvas类。 3. **游戏逻辑**:实现五子棋的核心算法,包括检查棋局合法性(确保没有棋子在同一位置上)、判断胜负(检查是否有五个连续的棋子)以及AI...

    ToolME-0.2.0.zip j2me开发工具类

    【ToolME-0.2.0.zip】是一个包含J2ME(Java 2 Micro Edition)开发工具类的压缩包。J2ME是Java平台的一个子集,主要用于移动设备、嵌入式系统等资源有限的环境。这个压缩包的版本号为0.2.0,表明这可能是该工具类库...

    j2me-engine:J2ME 平台的游戏引擎

    总的来说,j2me-engine是J2ME平台上开发游戏的得力工具,它降低了开发门槛,提高了开发效率,使开发者能够专注于创造有趣且引人入胜的游戏体验。虽然现代移动设备更多地转向了更强大如Android和iOS的平台,但对J2ME...

    J2ME记录库工具类RecordStoreUtil

    实用J2ME记录库工具类,在很多代码中都要用到

    j2me例子:俄罗斯方块

    这通常包括安装Java SDK(标准版)和一个J2ME开发工具,如NetBeans或Eclipse,它们提供了对J2ME项目的支持。你还需要配置模拟器或者连接实际设备进行测试。 【J2ME图形界面与用户交互】 在"俄罗斯方块"游戏中,...

    J2me实用工具20合1

    J2me实用工具20合1

Global site tag (gtag.js) - Google Analytics