我试图使用灰度图标,并允许用户将主题更改为他们选择的颜色 . 为此,我尝试使用PorterDuff.Mode.MULTIPLY,它几乎完全按照我的需要工作,除了白色也覆盖了颜色 . 我理想的是像Photoshop中的"Color"混合模式,图形保留其透明度和亮度,只修改图像的颜色 . 例如:
成为
在做了一些研究后,看起来ColorMatrixColorFilter类可以做我需要的,但我可以't seem to find any resources pointing to how the matrix is used. It'是一个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转换为具有光度信息的另一个颜色空间,例如Lab或HSL?如果是这样,我可以将该转换的矩阵相乘,然后将色调调整为THAT矩阵,然后将该矩阵应用为ColorFilter .
9 回答
这就是我用于游戏的内容 . 这是在网站上的各种文章中找到的各种部分的汇编 . 积分从@see链接转到原作者 . 请注意,使用颜色矩阵可以完成更多工作 . 包括倒置等......
要完成此操作,我应该添加一个示例:
如果您想调整亮度,对比度,饱和度和色调,这里是完整的代码 . 请享用!非常感谢@RichardLalancette
对于任何对如何使用ColorMatrixColorFilter感兴趣的人 . 我在这里使用的示例,当我在画布上绘制位图时,将每个像素转换为红色 .
该课程中的评论来自:http://developer.android.com/reference/android/graphics/ColorMatrix.html,这可以为您提供有关其工作原理的一些见解
Hue和RGB之间没有线性关系 . 色调以60°块(http://en.wikipedia.org/wiki/HSL_color_space#General_approach)分段定义,因此HSV和RGB之间没有简单的矩阵转换 . 要更改图像的色调,可以使用以下方法:
以下课程是对已经发布的答案的改进 . 这样可以更轻松地从
Bitmap
读取和创建ColorFilter
.用法示例:
我认为这种方法会给你你想要的东西:
http://android.okhelp.cz/hue-color-colored-filter-bitmap-image-android-example/
与其他答案一样,我使用颜色矩阵来实现此行为,但您可以传入常规的Android颜色资源 . 矩阵将颜色映射到图像值和白色之间的范围 .
我根据以下代码片段制作了一个ColorMatrixFilter测试器:
你可以在这里查看:https://play.google.com/store/apps/details?id=org.vaelostudio.colormatrixtester
即使使用
ColorMatrix
可以实现很多有用的效果,我个人会考虑使用ColorMap[]
和ImageAttributes
. 通过这样做,我们可以定义哪些颜色应该用哪种颜色替换 .