知识大全 关于游戏中高效的换色方法

Posted

篇首语:孙竹新添绿玉枝,稚禽学习绕檐飞。动中会取归根意,雨过白云横翠微。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于游戏中高效的换色方法相关的知识,希望对你有一定的参考价值。

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

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

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

  /**               * 修改png图片的调色板数据生成新的png图片               * @param imageSrc png图片的二进制数据字节数组               * @return 修改后的png图片               */              public Image getPLTEModifidImage(byte[] imageSrc)                                          if (imageSrc == null || imageSrc length <= )                                          return null;                             if (crcTable == null)                                          makeCrcTable();                             // PLTE chunk数据域的类型标识                            // see # PLTE                            String[] sPLTE = c ;                             int i j;                            int pos = startPos = ;                            byte[] data = imageSrc;                                                        for (i = ; i < data length; i++)                                                    if (Integer toHexString(data[i]) equals(sPLTE[ ])                                                  && Integer toHexString(data[i + ]) equals(sPLTE[ ])                                                  && Integer toHexString(data[i + ]) equals(sPLTE[ ])                     && Integer toHexString(data[i + ]) equals(sPLTE[ ]))                                                               pos = i;                                      break;                                                                                pos = ;                            startPos = pos;

  // 取得PLTE chunk数据域的数据长度()                             int imageNbColors = (                                                        ((data[pos] << ) & xff )                                                         | ((data[pos + ] << ) & x ff )                                                        | ((data[pos + ] << ) & x ff )                                                        | ((data[pos + ]      ) & x ff));                            // 计算的PLTE chunk数据个数(每个PLTE chunk数据由R G B三个字节数据组成)                            imageNbColors = imageNbColors/ ;                            // 为整形的PLTE chunk data分配空间                            int imageRGBColors[]    = new int[ imageNbColors ];                                  // = 数据长度( 个字节) + 类型标识( 个字节) + 校验码( 个字节) //                           for( i = pos j = ; i < pos + + imageNbColors * ; i++ j++ )//                                          if( j >= && (j )% == ) //                                                        println( );//                                          //                                          System out print( + data[i]);//                                                                                  pos += ;//                           println( \\n The number of PLTE chunks is + imageNbColors + );                                           if (imageRGBColors == null)                                          return null;                                                         // 生成整形的PLTE chunk data                             for( i = ; i < imageNbColors; i++ )                                                                         imageRGBColors[i] = (                                                                       (data[pos + ] & x ff) << )                                                                        | ((data[pos + ] & x ff) << )                                                                        | ((data[pos + ] & x ff));                                                                                                 

  pos += ;                                                                                    // 修改 PLTE chunk data                                                                                  int l r g b;                                                        // gray                             for (j = ; j < imageNbColors; j++)                                                                       r = imageRGBColors[j];                                                                      g = (r & x FF ) >> ;                                                                      b = r & x FF;                                                                      r = (r & xFF ) >> ;                                                                                    l = (b + g * + r * ) / ;                                                                                    imageRGBColors[j] = l << | l << | l;                                                                                  break;                                                                 // 生成新的 PLTE chunk data                            pos = startPos + ;                            for( i = ; i < imageNbColors ;i++)                                                                      data[pos ] = (byte)((imageRGBColors[i] >> ) ) ;                                          data[pos + ] = (byte)((imageRGBColors[i] >> ) );                                          data[pos + ] = (byte)(imageRGBColors[i] );                                          pos += ;                                                        // 更新 CRC 校验码                                                                                    int crc = updateCrcChunk( data startPos + startPos + + + ( imageNbColors * ) );                            data[pos + ] = (byte)(crc >> & x FF);                            data[pos + ] = (byte)(crc >> & x FF);                            data[pos + ] = (byte)(crc >> & x FF);                            data[pos + ] = (byte)(crc & x FF);                                                        pos = startPos;

  return Image createImage(data data length);             

  其实这个方法只能简单得修改图片颜色 更好效率更高的方法是 做一个小工具将原图片的调色板数据提取出来 然后需要换的各种颜色 全部事先导成调色板数据文件 程序里面做的是只是根据需要合并这些数据组成各种图片

cha138/Article/program/Java/JSP/201311/19464

相关参考

知识大全 eclipse中文本编辑器的换行

  Eclipse使用系统内置的TextEditor做为文本编辑器这个文本编辑器有一个长期存在的问题那就是文本无法换行虽然这个问题长期存在而且解决起来并不困难但是这却给人们带来不少麻烦 &n

减摩节油产品能否提高内燃机油的换油期?

一些减摩节油产品在广告宣传中,不仅强调其产品具有降低摩损,延长发动机使用寿命,节省燃油的功能,还称其产品具有延长内燃机油换油期的功能。有效减摩节油产品确实能降低摩损,延长发动机使用寿命,节省燃油,但要

知识大全 求一篇关于游戏的演讲稿。是介绍游戏的。谢谢

求一篇关于游戏的演讲稿。是介绍游戏的。谢谢!诛仙》是萧鼎在幻剑书盟连载的长篇武侠(古典仙侠)巨著,被新浪网誉为“后金庸武侠经典”,朝华出版社出版前六册,花山文艺出版社出版后两册。完美时空将其改编成一款

关于游戏交易类诈骗的特点,说法正确的有()

关于游戏交易类诈骗的特点,说法正确的有()。A、伺机下钩:骗子登录各种游戏交易平台、贴吧、Q群、论坛等,寻找游戏装备卖家,然后留下自己的QQ号B、佯装买家:当QQ联系上以后,骗子首先假装很关心装备的情

关于游戏交易类诈骗的特点,说法正确的有()

关于游戏交易类诈骗的特点,说法正确的有()。A、伺机下钩:骗子登录各种游戏交易平台、贴吧、Q群、论坛等,寻找游戏装备卖家,然后留下自己的QQ号B、佯装买家:当QQ联系上以后,骗子首先假装很关心装备的情

知识大全 我早上玩了一个关于三国的网路游戏,不用下载,可以直接用页面玩的,请问下谁知道哪是什么游戏啊

我早上玩了一个关于三国的网路游戏,不用下载,可以直接用页面玩的,请问下谁知道哪是什么游戏啊?网页三国websanguo.是一种网页游戏下面也是一个网页游戏travian.没了线上玩的网路游戏,不用下载

知识大全 我需要制作一个关于玩游戏的好处坏处的PPT,其他的就不说,就谈谈玩手机游戏好处和坏处(详细)。

我需要制作一个关于玩游戏的好处坏处的PPT,其他的就不说,就谈谈玩手机游戏好处和坏处(详细)。  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整

调仓换股的换股方法

调仓换股的换股方法一,以强换弱。主力资金操作一只股票,大致上可以分为吸筹、洗筹、拉升、出货、离场等几个阶段,当一只已完成主升浪,主力基本出完货,其上攻能量就会散尽,即使高位横盘,也只是强弩之末,上涨的

知识大全 关于如何换肤、子类化的解决方案

  关于如何换肤子类化的解决方案            对于应用程序的换肤及子类化下面是我尝试过一些

知识大全 写游戏全民枪战的400字作文

写游戏全民枪战的400字作文在全民枪战游戏背景中故事发生在数十年后的未来,一个藏有神秘物质的天外来客——一颗名为“天外核心”的陨石,降临地球,这起事件造成了上千人的死亡,并且引发了主流社会关于世界末日