-- 作者:wcdxyl
-- 发布时间:3/20/2006 1:55:00 PM
-- [转帖]古代帝国中的图片资源节省算法
代码: /** * 图片转换 * @param content 原始图片信息 * @param type 类型,1 :中立角色 2 : 敌方 0 :自己 */ public static void imgConvert(byte content[], int type){ try{ int pos = 33; int relpos = 0; relpos = ((content[pos] & 0xff) << 24 | (content[pos + 1] & 0xff) << 16 | (content[pos + 2] & 0xff) << 8 | content[pos + 3] & 0xff) & -1; pos += 4; int newcolor = -1; for(int idx = 0; idx < 4; idx++) newcolor = pixelConvert(content[pos + idx], newcolor); pos += 4; boolean flag = true; boolean flag1 = false; boolean flag2 = false; for(int idx = pos; idx < pos + relpos; idx += 3){ int b = content[idx] & 0xff; int g = content[idx + 1] & 0xff; int r = content[idx + 2] & 0xff; if(r > b && r > g){ //绿色和蓝色互换,中立角色 if(type == 1){ int tmp = b; b = g; r = b; g /= 2; } //转换为红色,敌人角色 else if (type == 2){ b = r; g = r; } content[idx] = (byte)b; content[idx + 1] = (byte)g; content[idx + 2] = (byte)r; } newcolor = pixelConvert(content[idx], newcolor); newcolor = pixelConvert(content[idx + 1], newcolor); newcolor = pixelConvert(content[idx + 2], newcolor); } newcolor = ~newcolor; int actpos = 41 + relpos; content[actpos] = (byte)(newcolor >> 24); content[actpos + 1] = (byte)(newcolor >> 16); content[actpos + 2] = (byte)(newcolor >> 8); content[actpos + 3] = (byte)newcolor; } catch(Exception e){} } /** * 像素转换 * @param pixel 像素 * @param color 颜色值 * @return */ public static int pixelConvert(byte pixel, int color){ int tmp = pixel & 0xff; color ^= tmp; for(int idx = 0; idx < 8; idx++) if((color & 1) != 0) //土黄色 color = color >>> 1 ^ 0xedb88320; else color >>>= 1; return color; } 效果图如下 原始图 用代码进行转换的效果图 注意 :为了能让你的程序实现转换更简单,也就是说你怎么知道要变换那些颜色值。例如上面说的转换条件为: r > b && r > g 所以一张图片的设计,像素的取舍需要跟美工配合好,需要画什么样的图片,以及需要转换的像素点。也可见MacroSpace中美工和程序是紧密地结合在一起的,做到了代码实现更方便以及用代码来节省图片资源。
|