BlendMode与PorterDuff的MUlTIPLAY存在区别

131 阅读1分钟

BlendMode.MODULATE对应的才是PorterDuff.Mode.MULTIPLY

android.graphics.BlendModeblendModeToPorterDuffMode有如下代码:

public static @Nullable PorterDuff.Mode blendModeToPorterDuffMode(@Nullable BlendMode mode) {
        if (mode != null) {
            switch (mode) {
                // b/73224934 PorterDuff Multiply maps to Skia Modulate
                case MODULATE:
                    return PorterDuff.Mode.MULTIPLY;
            }
        } else {
            return null;
        }
    }

从注释中也可以看出区别

public enum BlendMode {
    /**
     * {@usesMathJax}
     *
     * <p>
     *     <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
     *     <figcaption>Multiplies the source and destination pixels.</figcaption>
     * </p>
     * <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
     * <p>\(C_{out} = C_{src} * C_{dst}\)</p>
     *
     */
    MODULATE(13),

    /**
     * {@usesMathJax}
     *
     * <p>
     *     <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
     *     <figcaption>Multiplies the source and destination pixels.</figcaption>
     * </p>
     * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
     * <p>\(C_{out} =
     *      C_{src} * (1 - \alpha_{dst}) + C_{dst} * (1 - \alpha_{src}) + (C_{src} * C_{dst})\)
     * </p>
     */
    MULTIPLY(24),
}
public enum Mode {
        /**
         * <p>
         *     <img src="{@docRoot}reference/android/images/graphics/composite_MULTIPLY.png" />
         *     <figcaption>Multiplies the source and destination pixels.</figcaption>
         * </p>
         * <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
         * <p>\(C_{out} = C_{src} * C_{dst}\)</p>
         */
        MULTIPLY    (13),
    }

可以看出BlendMode.MODULATEPorterDuff.Mode.MULTIPLY算法一致,均是

alpha_{out} = alpha_{src} * alpha_{dst}
C_{out} = C_{src} * C_{dst}