Android 对具有特定发型图像图案的发型应用颜色过滤器的最佳方法是什么?

Android 对具有特定发型图像图案的发型应用颜色过滤器的最佳方法是什么?,android,imageview,colorfilter,Android,Imageview,Colorfilter,我正在为发型沙龙开发一个android应用程序。我有两张图片。一个是发型(头发),另一个是头发颜色模式。 我可以根据特定的rgb值更改发型的颜色 我的代码如下: int color = Color.rgb(182,132, 84); // getting rgb value Paint paint = new Paint(); paint.setColorFilter(new LightingColorFilter(color, 1)); transform.reset(); transfo

我正在为发型沙龙开发一个android应用程序。我有两张图片。一个是发型(头发),另一个是头发颜色模式。 我可以根据特定的rgb值更改发型的颜色

我的代码如下:

int color = Color.rgb(182,132, 84); // getting rgb value 
Paint paint = new Paint();
paint.setColorFilter(new LightingColorFilter(color, 1));

transform.reset();
transform.postTranslate(-width / 2.0f, -height / 2.0f);
transform.postRotate(getDegreesFromRadians(angle));
transform.postScale(scale, scale);
transform.postTranslate(position.getX(), position.getY());

canvas.drawBitmap(bitmap, transform, paint); 
但我正在寻找的解决方案是,假设我有彩色图案图像,那么就不可能从梯度图像中获得rgb值

比如:

我想在头发图像上应用上面的图案。
如果有人有想法,请回复。

只是为了好玩和好奇,我试着自己实现你的想法。
在准备好以下两幅xxhdpi图像(480 dpi,以便更好地进行缩放-然后我将它们放入
/res/drawable xxhdpi
文件夹中)

当然,我必须仔细地调整图像的大小,使其适合并完美地重叠

还有一头白发(你的一个复制品,做得“发白”——去饱和+发挥亮度/对比度)

我制作了这个布局,其中头发图像与头部重叠:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f000"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/head_xxh"
    />
    <ImageView
        android:id="@+id/imgHair"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/hair_wht_xxh"
    />
    <Button
        android:id="@+id/btnColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Random hair color"
        android:onClick="clickHandler"
    />
</RelativeLayout>
我得到的一些结果:

即使这篇文章看起来像安迪·沃罗尔的画,也不是。这是我的。:)
这似乎是你想要的结果

[编辑]

我没有尝试这个新想法,但是(通过一些额外的工作)您甚至可以更改其他颜色:

  • 眼睛
  • 口红
  • 眼部化妆(这需要一些耐心)

应用颜色过滤器:感谢@Der回复。如果“头发”是一个单独的图像,就像你在问题中提到的那样,是的(我想应该是这样的)。然后把这张图片放在一个无毛的头上。如果你有一张没有头发的脸,最好把头发作为一张单独的图片贴在脸上。通过将两者分开,您可以仅对头发应用颜色过滤器,并在瞬间更改其颜色。如果你一个像素一个像素地工作,完成着色将花费很长时间。非常感谢你的宝贵建议。喜欢吗?我做这个练习很开心。尝试更好的颜色-我主要使用标准的android颜色,你可以找到颜色来匹配真实的头发颜色。。。或幻想色彩
package com.dergolem.abc_2;

import java.util.Random;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;

public class Generic
extends Activity
{
    Random rnd = new Random();

    Button btn = null;
    ImageView img = null;

    @Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.hair);

        img = (ImageView) findViewById(R.id.imgHair);
        btn = (Button) findViewById(R.id.btnColor);
    }

    public void clickHandler(final View v)
    {
        colorize(rnd.nextInt(7));
    }

    private void colorize(final int num)
    {
        int clr = Color.WHITE;
        switch (num)
        {
            case 0:
            {
                clr = Color.RED;
                break;
            }
            case 1:
            {
                clr = Color.GREEN;
                break;
            }
            case 2:
            {
                clr = Color.BLUE;
                break;
            }
            case 3:
            {
                clr = Color.BLACK;
                break;
            }
            case 4:
            {
                clr = Color.CYAN;
                break;
            }
            case 5:
            {
                clr = Color.YELLOW;
                break;
            }
            case 6:
            {
                clr = Color.parseColor("#ff888800");
                break;
            }
        }

        img.setColorFilter(clr, PorterDuff.Mode.MULTIPLY);
    }
}