引用:
原帖由 sfsuvival 于 2010-04-08 19:23 发表
不是指这段吧...
我找不到其它先混合出result再与dest进行blending的地方...
IM可能还有其它处理
只用CompositeLinearDodge做不到效果...
case SUBTRACT:
return new Blender() {
@Override
public void blend(int[] src, int[] dst, int[] result) {
result[0] = Math.max(0, src[0] + dst[0] - 256);
result[1] = Math.max(0, src[1] + dst[1] - 256);
result[2] = Math.max(0, src[2] + dst[2] - 256);
result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255);
}
};
这部是是linearburn
dstPixels[x] = ((int) (dstPixel[3] + (result[3] - dstPixel[3]) * alpha) & 0xFF) << 24 |
((int) (dstPixel[0] + (result[0] - dstPixel[0]) * alpha) & 0xFF) << 16 |
((int) (dstPixel[1] + (result[1] - dstPixel[1]) * alpha) & 0xFF) << 8 |
(int) (dstPixel[2] + (result[2] - dstPixel[2]) * alpha) & 0xFF;
这部是alpha blending
不过,其实不要紧,我搞定了
public int lineardodge() {
Ra = RoundToUnity(Sa + Da);
return (int) (Ra * 255);
}
public int lineardodge(int src, int dest) {
Sc = src / 255D;
Dc = dest / 255D;
Sca = Sa * Sc;
Dca = Da * Dc;
return (int) (RoundToUnity(Sca + Dca) / Ra * 255);
}
public int linearburn() {
Ra = Sa + Da - Sa * Da;
return (int) (Ra * 255);
}
public int linearburn(int src, int dest) {
Sc = src / 255D;
Dc = dest / 255D;
Sca = Sa * Sc;
Dca = Da * Dc;
return (int) (RoundToUnity(Sca + Dca - Sa * Da) / Ra * 255);
}
目测与PS一样了,linearburn把f=Sc+Dc-1代入SVG那个公式,并设x,y,z=1(我猜的)
lineardodge其实就是plus,只不过原来没做区间验证,所以有问题,不过我看不懂公式怎么计算出Sa + Da的?
[
本帖最后由 haibara 于 2010-04-08 21:15 编辑 ]