WEB开发网
开发学院WEB开发Jsp 关于游戏中高效的换色方法 阅读

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

 2008-01-05 09:43:05 来源:WEB开发网   
核心提示: 众所周知,我们可以使用getRGB()取得取得图片的RGB颜色数据,然后修改RGB颜色数据,关于游戏中高效的换色方法,再用Image的静态方法createRGBImage()将修改后的RGB颜色数据生成新的png图片,但是这个方法效率低不说,而且就目前来说,再使用createIm

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


Tags:关于 游戏 高效

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接