0

我有以下图像:

在此处输入图像描述

现在我想在运行时将此图像过滤为不同的颜色。例如,我希望能够生成它的绿色版本,其中下部是深绿色,左上角是浅绿色。

我怎样才能做到这一点?这甚至可能吗?

我尝试过如下过滤位图:

private static Bitmap applyColorFilter(Bitmap source, int color) {

    Bitmap empty = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight());
    Canvas c = new Canvas(empty);
    Paint p = new Paint();

    PorterDuffColorFilter pdcf = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
    p.setColorFilter(pcdf);
    c.drawBitmap(empty, 0, 0, p);
    source.recycle();
    return empty;
}

我已经尝试了所有PorterDuff.Modes,但没有一个真正有效。有时(例如 SRC_IN)我看到圆圈完全被新颜色填充,没有任何阴影。在其他情况下,我看到一个正方形。

我考虑过生成一个本身没有颜色的源图像,并使用 alpha 通道渲染它的阴影。但是,我不确定这是否可行。我希望生成的图像完全不透明(除了您可以在上面看到的外部阴影)。

4

1 回答 1

0

我找到了使用ColorMatrixColorFilter.

// Take values from the destination color
int destA = (color >> 24);
int destR = (color >> 16) & 0xff;
int destG = (color >> 8) & 0xff;
int destB = color & 0xff;

// Give the same weight to source R,G,B, thus grasping the intensity
// -> the shading overlay
float mean = 0.33f;
ColorMatrixColorFilter cm = new ColorMatrixColorFilter(
        new float[]{
                mean,mean,mean,0,destR,
                mean,mean,mean,0,destG,
                mean,mean,mean,0,destB,
                0,0,0,1,destA }
);

Paint p = new Paint();
p.setColorFilter(cm);
...

不可避免地,这会稍微改变(变亮)目标颜色,所以我会等待几天以获得更好的解决方案。对于我的输入图像,我可以通过将mean值降低到大约来获得更好的结果。0.2。

使用 . 可能会获得相同的结果LightningColorFilter

于 2015-12-30T14:40:25.227 回答