注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

jiwenxu的博客

CODE

 
 
 

日志

 
 

j2me使用调色板修改PNG图片  

2007-11-10 16:45:48|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 找到调色板区,根据原有格式修改之后,生成新的crc校验码,然后替换原来的调色板。这样就可以用一个png图片,创建多个变色副本
该文章转载自网络大本营:

public class PalettedImage {

   public Image getPalettedImage(byte[] data, int[]originalColors,
           int[] palettedColors) {
       byte[] tempData = new byte[data.length];
       System.arraycopy(data, 0, tempData, 0, data.length);
       Image img = null;
       int[] parameter = { 0, 0, 0 };
       analyze(tempData, parameter);
       for (int i = 0; i < originalColors.length; i++) {
           replaceColor(tempData, parameter, originalColors[i],
                   palettedColors[i]);
       }
       fillData(tempData, parameter);
       try {
           img = Image.createImage(tempData, 0, data.length);
       } catch (Exception e) {
           System.out.println("getPalettedImage &&  " + e.toString());
       }
       return img;
    }

   private void analyze(byte[] data, int[] para) {
       int offset = 8;
       int chunkLen = 0;
       while (data[offset + 4] != 0x50 || data[offset + 5] != 0x4c
               || data[offset + 6] != 0x54 || data[offset + 7] != 0x45) {
           chunkLen = readInt(data, offset);
           offset += (4 + 4 + chunkLen + 4);
       }
       chunkLen = readInt(data, offset);
       para[2] = chunkLen / 3;
       para[0] = offset + 8;
       para[1] = offset + 8 + chunkLen;
    }

   private int readInt(byte[] data, int offset) {
       return ((data[offset] & 0xFF) << 24)
               | ((data[offset + 1] & 0xFF) << 16)
               | ((data[offset + 2] & 0xFF) << 8) | (data[offset + 3]& 0xFF);
    }

   private void replaceColor(byte[] data, int[] para, intoldColor,
           int newColor) {
       byte rr = (byte) ((oldColor >> 16) & 0xff);
       byte gg = (byte) ((oldColor >> 8) & 0xff);
       byte bb = (byte) (oldColor & 0xff);
       for (int i = 0, offset = para[0], temp = 0; i < para[2]; i++,offset += 3) {
           if (rr == data[offset] && gg == data[offset + 1]
                   && bb == data[offset + 2]) {
               data[offset] = (byte) ((newColor >> 16) & 0xff);
               data[offset + 1] = (byte) ((newColor >> 8) & 0xff);
               data[offset + 2] = (byte) (newColor & 0xff);
               break;
           }
       }
    }

   private void fillData(byte[] data, int[] para) {
       int checksum = update_crc(data, para[0] - 4, para[2] * 3 +4);
       data[para[1]] = (byte) ((checksum >> 24) & 0xff);
       data[para[1] + 1] = (byte) ((checksum >> 16) &0xff);
       data[para[1] + 2] = (byte) ((checksum >> 8) &0xff);
       data[para[1] + 3] = (byte) ((checksum) & 0xff);
    }

   private int update_crc(byte[] buf, int off, int len) {
       int c = 0xffffffff;
       int n, k;
       int xx;
       int[] crc_table = new int[256];
       for (n = 0; n < 256; n++) {
           xx = n;
           for (k = 0; k < 8; k++) {
               if ((xx & 1) == 1) {
                   xx = 0xedb88320 ^ (xx >>> 1);
               } else {
                   xx = xx >>> 1;
               }
           }
           crc_table[n] = xx;
       }

       for (n = off; n < len + off; n++) {
           c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>> 8);
       }
       return (c ^ 0xffffffff);
    }

}
 接口就是getPalettedImage()函数,只需要输入原始图片的byte数组,以及需要替换颜色的颜色值还有目标颜色值就行了。因为可以同时替换多个颜色,所以输入参数是代表颜色的整形的数组。总之,要保证原始颜色与目标颜色一一对应就好了。方法简单实用

  评论这张
 
阅读(304)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018