首页 > 学院 > 开发设计 > 正文

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

2019-11-18 13:33:56
字体:
来源:转载
供稿:网友

    众所周知,我们可以使用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;



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表