6

好的,所以这与我之前关于 ColorMatrixColorFilter 的问题有些相关,但我觉得这是一个截然不同的问题。我想知道是否有办法——或者更确切地说,如何扩展 ColorFilter 类来创建我自己的自定义颜色过滤器。对于我需要完成的工作,我需要编写一个自定义过滤器来查询每个像素,将其 RGB 值转换为 HSL 或 LAB,修改色调,将其转换回 RGB,并将该像素设置为新值。

我想我可以简单地编写一个执行此操作的类,接受一个 Drawable 和一定量的色调变化来执行,但是必须为每个 Drawable 以及每个 Drawable 的每个状态手动调用它,而ColorFilter 似乎可以很好地处理这个问题。鉴于 LightingColorFilter 和 ColorMatrixColorFilter 的存在,它似乎可以被子类化,但到目前为止,我寻找任何类型的文档的努力都是徒劳的。我似乎找不到这三个(Lighting、ColorMatrix、ColorFilter)中任何一个的源代码;我在想他们可能是用本机代码完成的?

我的问题是:我怎样才能正确地继承 ColorFilter?如果我找不到一个好的答案,如果有人能够找到源(我已经搜索了 Android 的 git)并发布了一个链接,那也会很有帮助。

谢谢!

4

2 回答 2

1

正如您所说,源代码显示 ColorFilter 使用本机代码,因此您不能真正将其子类化。

除了为您想做的事情创建自己的课程之外,可能没有其他方法。

于 2010-12-10T13:28:18.750 回答
1

您可以使用它来应用您自己的滤色器技术,不幸的是适用于 RGB:

// The matrix is stored in a single array, and its treated as follows: [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
// When applied to a color [r, g, b, a], the resulting color is computed as (after clamping) ;
//   R' = a*R + b*G + c*B + d*A + e;
//   G' = f*R + g*G + h*B + i*A + j;
//   B' = k*R + l*G + m*B + n*A + o;
//   A' = p*R + q*G + r*B + s*A + t;

Paint paint = new Paint();
float[] matrix = {
        1, 1, 1, 1, 1, //red
        0, 0, 0, 0, 0, //green
        0, 0, 0, 0, 0, //blue
        1, 1, 1, 1, 1 //alpha
};

paint.setColorFilter(new ColorMatrixColorFilter(matrix));

在我的情况下,我需要以任何方式在 PhotoShop 中应用诸如着色之类的 HSL 效果,这不是 100% 正确的,但这会产生很好的结果:

 float[] HSL = imageLayer.getColorize();
 PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(ColorUtils.HSLToColor(HSL),PorterDuff.Mode.MULTIPLY);
 paint.setColorFilter(colorFilter);
于 2020-08-06T09:30:13.733 回答