改变可绘制对象的色彩平衡

4
可以更改Drawable的色彩平衡吗?例如,我想将 enter image description here 转换成 enter image description here。我试过这个方法,但它会将我的整个Drawable颜色都变为一个唯一的颜色:
        Drawable drawable; // my drawable
        float r = Color.red(110) / 255f;
        float g = Color.green(150) / 255f;
        float b = Color.blue(200) / 255f;

        ColorMatrix cm = new ColorMatrix(new float[] {
                // Change red channel
                r, 0, 0, 0, 0,
                // Change green channel
                0, g, 0, 0, 0,
                // Change blue channel
                0, 0, b, 0, 0,
                // Keep alpha channel
                0, 0, 0, 1, 0,
        });
        ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);

        drawable.setColorFilter(cf);

我明确指出我不希望将我的源图像分成两个或更多层,并对其中一个进行着色。


1
你需要将源图像分成两个或更多层,并对其中一个进行上色。 - pskink
这是唯一的方法吗?:( - Jéwôm'
我认为有一些算法可以做到这一点,但我不认为它们是简单和短的... - pskink
看一下这个:https://dev59.com/PW855IYBdhLWcg3wbjnO#32703759 - Jared Rummler
2个回答

1

您可以使用mutate().setColorFilter()将所需颜色的着色应用于图像,然后将带有新颜色的Drawable设置到您的ImageView中:

   ImageView imgImagen = (ImageView)findViewById(R.id.myImageView);
    Drawable myImage = getResources().getDrawable( R.drawable.boy );
    //Using red color.
    myImage.mutate().setColorFilter(0xffff0000, PorterDuff.Mode.MULTIPLY);
   imgImagen.setImageDrawable(myImage);

例如使用这个 ImageView
   <ImageView
        android:id="@+id/myImageView"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:src="@drawable/boy"
        android:contentDescription="" />

你将得到这张图片作为结果:

enter image description here

您可以使用示例中定义的颜色:
 myImage.mutate().setColorFilter(Color.argb(255, 110, 150, 200), PorterDuff.Mode.MULTIPLY);

0
我看到你的角色有眼睛和一些属性,在颜色变化时需要保持安全,所以我们需要对这个资源进行更多的控制,因此我们将其转换为位图。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brown_man);

你的位图可能是不可变的,所以为了使其可变:

Bitmap myBitmap = bitmap.copy(Bitmap.Config.RGB_565, true);

然后我们需要使用getPixels()获取像素,并使用指定的颜色重新setPixels()

int[] pixels = new int[myBitmap.getHeight() * myBitmap.getWidth()];
    myBitmap.getPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());

    for (int i = 0; i < pixels.length; i++) {

        if (pixels[i] == color /*Color to change int value*/)
            pixels[i] = newColor /*The new color you want to change*/;
    }
    myBitmap.setPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());

因此,您可以根据需要使用此位图。

需要考虑的一些事情:

  • 您的资源字符必须具有高分辨率颜色,以便轻松指定和更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接