更改 Drawable 的颜色平衡
Change the color balance of a Drawable
可以更改 Drawable 的颜色平衡吗?
比如我要转换
to =>
我尝试了这个,但它会将我的 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);
我指定我不想将我的 src 图像拆分为 2 个或更多层并对其中一个进行着色。
您可以使用 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="" />
您将得到这张图片作为结果:
您也可以使用示例中定义的颜色:
myImage.mutate().setColorFilter(Color.argb(255, 110, 150, 200), PorterDuff.Mode.MULTIPLY);
我看到你的角色有眼睛和一些在颜色变化期间需要安全的属性,所以我们需要对该资源进行更多控制,因此我们将其转换为位图:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brown_man);
您的位图可能不可变,因此要使其可变:
Bitmap myBitmap = bitmap.copy(Bitmap.Config.RGB_565, true);
然后我们必须getPixels()
And re 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());
因此,您可以随意使用此位图。
需要考虑的一些事项:
- 您的资源角色必须具有高度分辨率颜色,以便于指定和更改。
可以更改 Drawable 的颜色平衡吗?
比如我要转换
我尝试了这个,但它会将我的 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);
我指定我不想将我的 src 图像拆分为 2 个或更多层并对其中一个进行着色。
您可以使用 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="" />
您将得到这张图片作为结果:
您也可以使用示例中定义的颜色:
myImage.mutate().setColorFilter(Color.argb(255, 110, 150, 200), PorterDuff.Mode.MULTIPLY);
我看到你的角色有眼睛和一些在颜色变化期间需要安全的属性,所以我们需要对该资源进行更多控制,因此我们将其转换为位图:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brown_man);
您的位图可能不可变,因此要使其可变:
Bitmap myBitmap = bitmap.copy(Bitmap.Config.RGB_565, true);
然后我们必须getPixels()
And re 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());
因此,您可以随意使用此位图。
需要考虑的一些事项:
- 您的资源角色必须具有高度分辨率颜色,以便于指定和更改。