Java me 在j2me项目中混淆图标
我使用Netbeans作为IDE创建了一个基于j2me的项目。现在我想混淆我在这个项目中的资源(图标、图像)。这样图像的名称或外观就会改变。怎么做呢?你可以将图像文件的名称改为没有扩展名,只有一两个字母。然后更改代码以使用这些新名称而不是原始名称。Java me 在j2me项目中混淆图标,java-me,icons,Java Me,Icons,我使用Netbeans作为IDE创建了一个基于j2me的项目。现在我想混淆我在这个项目中的资源(图标、图像)。这样图像的名称或外观就会改变。怎么做呢?你可以将图像文件的名称改为没有扩展名,只有一两个字母。然后更改代码以使用这些新名称而不是原始名称。 如果您的图像文件是PNG,您可以在构建期间将PLTE块更改为错误值,并在执行期间更正它们。 Image类没有一种方法可以轻松更改颜色。一种解决方法是调用getRGB方法并迭代rgbData数组。 更好的方法是读取文件内容、更改调色板字节并从结果数据创
如果您的图像文件是PNG,您可以在构建期间将PLTE块更改为错误值,并在执行期间更正它们。
Image类没有一种方法可以轻松更改颜色。一种解决方法是调用getRGB方法并迭代rgbData数组。 更好的方法是读取文件内容、更改调色板字节并从结果数据创建图像。首先,让我们创建一个helper方法来读取整个InputStream并返回一个包含其内容的字节数组:
private byte [] readStream (InputStream in) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] buff = new byte [1024];
int size = in.read(buff);
while (size >= 0) {
baos.write(buff, 0, size);
size = in.read(buff);
}
return baos.toByteArray();
}
接下来,我们必须找到调色板块在字节数组中的位置。下面是另一个助手方法:
// return index where P of PLTE is found at buff array or -1
private int getPLTEIndex (byte [] buff) {
int i = -1;
// 4 == "PLTE".size()
if (buff != null && buff.length >= 4) {
boolean foundPalete = false;
boolean endOfBuff = false;
do {
i++;
foundPalete = buff[i] == 'P'
&& buff[i +1] == 'L'
&& buff[i +2] == 'T'
&& buff[i +3] == 'E';
endOfBuff = (i +4 >= buff.length);
} while (!foundPalete && !endOfBuff);
if (endOfBuff) {
i = -1;
}
}
return i;
}
最后,介绍一种从颜色类型为3的PNG文件调色板中更改颜色的方法:
private byte [] setRGBColor (byte [] buff, int colorIndex, int colorNewValue) {
int i = getPLTEIndex(buff);
if (i >= 0) {
i += 4; // 4 == "PLTE".size()
i += (colorIndex * 3); // 3 == RGB bytes
if (i + 3 <= buff.length) {
buff[i] = (byte) (((colorNewValue & 0x00ff0000) >> 16) & 0xff);
buff[i +1] = (byte) (((colorNewValue & 0x0000ff00) >> 8) & 0xff);
buff[i +2] = (byte) ((colorNewValue & 0x000000ff) & 0xff);
}
}
return buff;
}
如图所示
InputStream in = getClass().getResourceAsStream("/e");
try {
byte [] buff = readStream(in);
Image original = Image.createImage(buff, 0, buff.length);
buff = setRGBColor(buff, 0, 0x00ff0000); // set 1st color to red
buff = setRGBColor(buff, 1, 0x0000ff00); // set 2nd color to green
Image updated = Image.createImage(buff, 0, buff.length);
} catch (IOException ex) {
ex.printStackTrace();
}