好的,这与我之前关于ColorMatrixColorFilter的问题有些关系,但我觉得这是一个明显不同的问题。我想知道是否有一种方法-或者更确切地说,如何扩展ColorFilter类来创建我自己的自定义滤色器。对于我需要完成的工作,我需要编写一个自定义过滤器,它将查询每个像素,将其RGB值转换为HSL或LAB,修改色调,将其转换回RGB,并将该像素设置为新值。
我在想,我可以简单地写一个类来做这件事,接受一个可绘制的和一些色调变化来执行,但它必须手动调用每个可绘制的,每个可绘制的状态,而ColorFilter似乎很好地处理了这一点。考虑到LightingColorFilter和ColorMatrixColorFilter的存在,似乎可以对其进行子类化,但到目前为止,我查找任何类型的文档的努力都是徒劳的。我似乎找不到这三个(Lighting,ColorMatrix,ColorFilter)中的任何一个的源代码;我想它们可能是在本机代码中完成的?
我的问题是:我怎样才能正确地继承ColorFilter?如果我找不到一个好的答案,如果有人能够找到源代码(我已经搜索了Android的git)并发布了一个链接,那也会很有帮助。
谢谢!
发布于 2010-12-10 21:28:19
正如您所说,source code显示ColorFilter使用本机代码,因此您不能真正将其子类化。
除了为你想要做的事情创建你自己的类之外,可能没有其他方法。
发布于 2020-08-06 17:30:14
您可以使用它来应用您自己的滤色器技术,不幸的是,它在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));无论如何,在我的例子中,我需要应用HSL效果,比如PhotoShop中的colorize,它不是100%正确的,但这给了我很好的结果:
float[] HSL = imageLayer.getColorize();
PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(ColorUtils.HSLToColor(HSL),PorterDuff.Mode.MULTIPLY);
paint.setColorFilter(colorFilter);https://stackoverflow.com/questions/4372992
复制相似问题