分享

关于手机上图层混合的处理方法.?(波斯王子2,3的技术)

 勤奋不止 2011-02-06

关于手机上图层混合的处理方法. (波斯王子2,3的技术)

(2010-08-02 18:45:07)
标签:

杂谈

以前关注过我blog的人应该记得我曾经放出过相关的图..

关于手机上图层混合的处理方法. <wbr>(波斯王子2,3的技术)


但是因为当时并没有完全理解所谓的光影层的做法,以及光影层的算法.所以当时也只是按照粗劣的想法构造相关的模型测试一下...效果当然和游戏原作差距很大...
昨晚晚上有人和我提起的时候,我不由的认真起来,在花费了一个晚上的时间之后..(准确的说是5个多小时...到凌晨2点多....)终于破解了这个迷惑了很多人的问题...
准确的说...是因为直观画面的关系,导致的一种误解的想法...因为我首先想到的是半透明...选择性半透明.囧..不过没有想到这样的做法和半透明没有一点关系....原理很减单....就是photoshop里面的2个图层之间上层图层使用颜色减淡的效果而已....也正是这个误解导致了我浪费了 3~4个小时的时间..而最后一个小时的时间浪费的原因是因为符号问题.因为运算级的问题忘记加括号了....... 写东西也要细心啊...
基本原理其实就一个共识而已: 结果色=基色+(基色*混合色)/(255-混合色)=__=
如果R,G,B超越FF的话,就强制等于FF...然后就OK了=v=
CODE:

//首先要创建一些东西
int w=176, h=208; //需要创建的图像的宽高
int longth = w * h;
int back_Rgb[] = new int[longth];//背景图片
  int light_Rgb[] = new int[longth];//光影图片
int dscRgb[] = new int[longth];//最终生成的目标图片.


//然后就是获取图像数组.获得图片backImg,lightImg的相关数组.
try {
    backImg.getRGB(back_Rgb, 0, w, 0, 0, w, h);
    lightImg.getRGB(light_Rgb, 0, w, 0, 0, w, h);
  }
  catch (Exception ex) {
    ex.printStackTrace();
  }
//下面是混合部分
  for (int i = 0; i < longth; i++) {
    int R1, R2, G1, G2, B1, B2, RR, GG, BB;
//从把颜色从AARRGGBB(0X00000000~0XFFFFFFFF)中分离出R,G,B独立的颜色参数.都是0~255
//分离back图片的数组的颜色.保存为R1,G1,B1

    R1 = (back_Rgb - 0xff000000) >> 16;
    G1 = ( (back_Rgb - 0xff000000) - (R1 << 16)) >> 8;
    B1 = (back_Rgb - 0xff000000) - (R1 << 16) - (G1 << 8);
//分离light图片的数组的颜色.保存为R2,G2,B2

    R2 = (light_Rgb - 0xff000000) >> 16;
    G2 = ( (light_Rgb - 0xff000000) - (R2 << 16)) >> 8;
    B2 = (light_Rgb - 0xff000000) - (R2 << 16) - (G2 << 8);
//这是对2个颜色的混合处理,根据是颜色减淡的公式:a+ab/(255-b),其中a为基色,b为混合色

    RR = R1 + (R1 * R2) / (255 - R2);
    GG = G1 + (G1 * G2) / (255 - G2);
    BB = B1 + (B1 * B2) / (255 - B2);

//如果数值超出范围,就取最高值255

    if (RR >= 255) {
    RR = 255;
    }
    if (GG >= 255) {
    GG = 255;
    }
    if (BB >= 255) {
    BB = 255;
    }
//把颜色从R,G,B独立的颜色参数转化为AARRGGBB的形式.

    dscRgb = (RR << 16) + (GG << 8) + BB + 0xff000000;
  }

//进行过上面的相关的步骤后,创建新图片...看看你得到的图片是否和我的一样呢~_~

trueImage = Image.createRGBImage(dscRgb, w, h, true);


有时候感觉GAMELOFT东西确实很不错.但是有时候深究起来的话,的确是我们确实会,但是却思路没有达到.的确如他们中的一个策划所说:对于设计者来说,很多NICE效果的实现都是由一个个点子开始,并经由和美术,程序等多方面的摩擦和碰撞才产生出火花的。
顺便说一下,上面的东西稍微加一下修改(比如把上面东西物块化).就连中国GAMELOFT的开发人员都觉得扯的罗马尼亚GAMELOFT的某游戏的效果...(=___=不能再多说了.否则估计会被GAMELOFT公司的人砍吧..=___=涉嫌堕落了几天动画游戏,用老东西充数赔罪的 fish...OTL...)

顺便把相关的一些photoshop中的颜色处理方式用程序来运算的方法写出来好了..(网上找的,也是给我写上面代码理论支持的一些公式
注:a为基色,b为混合色
- Darken(变暗):min(a, b)
- Lighten(变亮):max(a, b)
- Multiply(正片叠底):a * b / 255
- Screen(屏幕): 255 - (255 - a) * (255 - b) / 255
- Overlay(叠加):a <= 128 ? a * b / 128 : 255 - (255 - a) * (255 - b) / 128
- Hard Light(强光):HardLight(a, b) = Overlay(b, a)
- Hard Mix(实色混合):a + b <= 255 ? 0 : 255
- Difference(差值):|a - b|
- Exclusion(排除):a + b - a * b / 128
- Pin Light(点光,针状变亮):b >= 128 ? max(a, (b - 128) * 2 ) : min(a, b * 2 )
- Linear Burn(线性加深):a + b > 255 ? (a + b) % 256 : 0
- Linear Dodge(线性减淡):a + b > 255 ? 255 : a + b
- Color Burn(颜色加深):a-(255-a)*(255-b/)/b
- Color Dodge(颜色减淡):a+ab/(255-b)


-----------------------
P.S:如果是C++或者别的话,有直接有从0x000000这种提取R,G,B三个数值的方法..我这里说的只是针对手机这种连接受限制设备,用J2ME的处理方法而已...

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多