我正在为一个应用程序开发一个 UI,我正在尝试使用灰度图标,并允许用户将主题更改为自己选择的颜色。为了做到这一点,我只是试图应用一个颜色过滤器的一些排序覆盖在可绘制的顶部的颜色。我试过用 PorterDuff。多重模式,它的工作几乎完全符合我的需要,除了白色得到覆盖的颜色以及。我想要的是类似 Photoshop 中的“颜色”混合模式,图形保持其透明度和亮度,只修改图像的颜色。例如:
在做了一些研究之后,似乎 ColorMatrixColorFilter 类可以满足我的需要,但是我似乎找不到任何指向矩阵如何使用的资源。这是一个4x5的矩阵,但我需要知道的是我如何去设计矩阵。有什么想法吗?
编辑: 好的,我目前的发现如下:
1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
其中这个矩阵是恒等矩阵(当应用时,不做任何更改) ,数字范围从0到1(浮点数)。此矩阵将与每个像素相乘以转换为新颜色。所以我开始有点糊涂了。因此,我认为每个像素都是一个1 x 4的矢量,其中包含的 argb 值(例如 0.2, 0.5, 0.8, 1
)将点缀着变换矩阵。因此,要将图像的红色强度加倍,你可以使用一个矩阵,比如:
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
它会给你一个 0.4, 0.5, 0.8, 1
的矢量(颜色)。从有限的测试来看,情况似乎是这样的,并且工作得很好,但是我实际上还是遇到了同样的问题(比如白色会变色)。进一步的阅读告诉我,这是因为它在 RGB 值上进行转换,而对于色相移动,值应该首先转换为 HSL 值。因此,我可以编写一个类来读取图像并转换颜色,然后用新的颜色重新绘制图像。这给 StateListDrawables 带来了另一个问题,因为我不确定如何在代码中获取并修改所有这些内容,以及这个过程会有多慢。:/
嗯,好的,那么我想我还有一个问题,那就是矩阵是否可以用来将 RGB 转换成另一个带有亮度信息的颜色空间,比如 L一b 或 HSL?如果是这样的话,我可以只是乘以矩阵的转换,然后使色相调整到该矩阵,然后应用该矩阵作为颜色过滤器。