引用:
原帖由 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 编辑 ]