关于游戏中高效的换色方法

王朝other·作者佚名  2008-05-31
宽屏版  字体: |||超大  

众所周知,我们可以使用getRGB()取得取得图片的RGB颜色数据,然后修改RGB颜色数据,再用Image的静态方法createRGBImage()将修改后的RGB颜色数据生成新的png图片。但是这个方法效率低不说,而且就目前来说,假如要做中国市场,还得使用MIDP1.0。所以今天我想谈一下另外一种换色方式,通过修改调色板数据来达到换色的目的,记得以前我在论坛发过一篇关于换色和旋转图片的文章,但是那次仅仅限于讨论,这次要说的是我已经应用在实际游戏当中的换色方法

首先,我们取得png图片的二进制数据,修改其中的调色板域(PLTE chunk)数据,再使用createImage(byte[] imageData,int imageOffset,int imageLength)将修改后的二进制数据生成新的png对象。(换色是基于对图像格式的熟悉来进行的,所以你必须先了解PNG图片的格式,这个可以参考http://www.w3.org/TR/PNG/)

下面是获得图片调色板数据的方法(感谢飘飘白云的代码)

/**

* 修改png图片的调色板数据生成新的png图片

* @param imageSrc png图片的二进制数据字节数组

* @return 修改后的png图片

*/

public Image getPLTEModifidImage(byte[] imageSrc)

{

if (imageSrc == null imageSrc.length <= 1)

return null;

if (crcTable == null)

makeCrcTable();

// PLTE chunk数据域的类型标识

// see http://www.w3.org/TR/PNG/#11PLTE

String[] sPLTE = {"50", "4c", "54", "45"};

int i,j;

int pos = 0,startPos = 0;

byte[] data = imageSrc;

for (i = 0; i < data.length; i++)

{

if (Integer.toHexString(data[i]).equals(sPLTE[0])

&& Integer.toHexString(data[i + 1]).equals(sPLTE[1])

&& Integer.toHexString(data[i + 2]).equals(sPLTE[2])

&& Integer.toHexString(data[i + 3]).equals(sPLTE[3]))

{

pos = i;

break;

}

}

pos -= 4;

startPos = pos;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有