首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建ColorFilter的自定义子类?

创建ColorFilter的自定义子类?
EN

Stack Overflow用户
提问于 2010-12-07 10:58:44
回答 2查看 1.6K关注 0票数 6

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

我在想,我可以简单地写一个类来做这件事,接受一个可绘制的和一些色调变化来执行,但它必须手动调用每个可绘制的,每个可绘制的状态,而ColorFilter似乎很好地处理了这一点。考虑到LightingColorFilter和ColorMatrixColorFilter的存在,似乎可以对其进行子类化,但到目前为止,我查找任何类型的文档的努力都是徒劳的。我似乎找不到这三个(Lighting,ColorMatrix,ColorFilter)中的任何一个的源代码;我想它们可能是在本机代码中完成的?

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-10 21:28:19

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-08-06 17:30:14

您可以使用它来应用您自己的滤色器技术,不幸的是,它在RGB上有效:

代码语言:javascript
复制
// 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));

无论如何,在我的例子中,我需要应用HSL效果,比如PhotoShop中的colorize,它不是100%正确的,但这给了我很好的结果:

代码语言:javascript
复制
 float[] HSL = imageLayer.getColorize();
 PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(ColorUtils.HSLToColor(HSL),PorterDuff.Mode.MULTIPLY);
 paint.setColorFilter(colorFilter);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4372992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档