【问题标题】:Android ColorFilter - Porter-Duff ModesAndroid ColorFilter - Porter-Duff 模式
【发布时间】:2012-05-02 00:09:41
【问题描述】:

我正在尝试解决 android ColorFilters 的问题。文档很差,所以主要方法是尝试不同的变体。

问题:

有一个位图。有些像素的 alpha=255,有些像素的 alpha=0。我正在尝试用特定颜色绘制一个圆圈。我希望位图中的 alpha 通道保持不变,但是在绘制时我想将颜色乘以位图 alpha。

因此,在绘制圆时,我希望不绘制 alpha=0 的像素,而将 alpha=255 的像素绘制成我想要的颜色。 Alpha 通道不应改变。

我正在尝试使用 porter-duff ColorFilter(android sdk 中的 PorterDuffColorFilter 类)。

这里的官方网站模式太多,无法理解的描述:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

我想我应该使用DST_ATOPSRC_ATOP,但它们不像我描述的那样工作。

另外,porter-duff colorfilter 的构造函数中有一个奇怪的参数srcColor

我不明白公式[Da, Sc * Da + (1 - Sa) * Dc] 中的“Sa”和“Sc”是什么意思。它可以来自传递给颜色过滤器构造函数的颜色,也可以由“paint.setColor”设置颜色。

有人知道,它是如何工作的吗?

【问题讨论】:

  • 你可以google porter duff看看这些模式是什么意思。
  • 这篇很棒的文档用图片解释了 PorterDuff 模式:ssp.impulsetrain.com/porterduff.html 请注意它不像 android 那样添加“src_”:所以“IN”=“SRC_IN”

标签: android colors filter porter-duff colorfilter


【解决方案1】:

SaSc 分别是“source alpha”和“source color”的缩写。 PorterDuffColorFilter 构造函数中的srcColor 参数是用于这些值的颜色。

对于您的情况,Mode.MULTIPLY 可能效果最好。

【讨论】:

  • 但是paint.setColor 是如何影响它的呢?我试图改变它并理解它会影响!我认为它应该在这样的混合公式中?
  • 另外,在这种情况下,乘法模式不起作用。 Alpha 通道为零的像素也会被绘制 :(
  • 我不完全确定这部分,但我认为如果你为你的画设置一个颜色,这个值会以某种方式包含在某个 src/dst 参数之一中。在您的情况下,颜色 alpha 似乎也被纳入计算,使所有内容都成为可靠的 1.0-alpha。您应该尝试绘制位图而不在油漆上设置颜色。
  • 嗯...“Da”是目标 alpha 是否正确 - 我要在其中绘制的位图的 alpha 通道(确切地说,我在位图上创建了一个 Canvas 并绘制到那个画布)?
  • 是的,我想是的。但是这个值也受你的颜色影响也不是不可能的。
【解决方案2】:

请注意,Porter-Duff 模式仅被定义为与预乘 alpha 一起正常工作。这意味着 R、G 或 B 分量都不能超过 alpha 值。

GitHub project 用于展示所有 Porter-Duff 模式的 Android 项目。 Android App 也可以在 Playstore 上找到。

【讨论】:

  • 该应用程序显示了公式如何很好地影响图像。如果您包含一些更简单的图像作为选项会更好。
【解决方案3】:

经过一些研究,我得出以下关于 Android 中 PorterDuff 颜色模式的结论,

  • Sa 和 Sc 是源 Alpha 和源颜色, 例如如果我将 ColorFilter 设置为类似 myDrawable.setColorFilter(desiredColor,Mode.SRC_ATOP) 的可绘制对象,则 Sa 和 Sc 值将取自 desiredColor 而不是 myDrawable。 Da 和 Dc 将是 myDrawable 的原始 alpha 和颜色值。
  • 我有一个图像,我想通过用户输入的 alpha 值应用某种颜色。我尝试使用 PorterDuff 模式,我原来的 myDrawable 是一个九个补丁可绘制对象,它具有透明背景和三角形角,如消息气泡三角形。当我使用

    public static final PorterDuff.Mode SRC [Sa, Sc]

应用源颜色和源 Alpha,我认为上面的 setColorFilter 方法所需的颜色和 Alpha 值,我得到正确的颜色值,即颜色和 alpha 正确应用于新的 Drawable,但该图像上的三角形被完全清洗/删除。 所以我不得不使用 ColorMatrixFilter 和设置矩阵并将 alpha 值分别设置为可绘制。

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2017-03-02
    • 2013-02-27
    • 2015-02-23
    相关资源
    最近更新 更多