十六进制字符串到颜色名称

时间:2018-07-12 20:54:45

标签: java android android-studio android-activity

这不是重复的问题,我知道这是我的一些问题,但是我需要有关如何实现到我的应用程序的帮助。

我正在尝试制作一个可以捕获颜色的android应用程序,但是我只发现了如何获取Hex值,但我确实需要颜色的名称! 请帮助,有人! 下面是整个代码,但上面写着

public static String makeHexString(int value) {
return "#" + Integer.toHexString(value).substring(2);}

这行,Integer.toHexString如何获取颜色名称而不是十六进制值?

 public class ColorItem implements Parcelable {

    protected final long mId;

    protected int mColor;

    protected String mName;

    protected final long mCreationTime;

    protected transient String mHexString;

    protected transient String mRgbString;

    protected transient String mHsvString;

    public ColorItem(long id, int color) {
        mId = id;
        mColor = color;
        mCreationTime = System.currentTimeMillis();
    }

    private ColorItem(Parcel in) {
        this.mId = in.readLong();
        this.mColor = in.readInt();
        this.mCreationTime = in.readLong();
        this.mName = in.readString();
    }

    public ColorItem(int color) {
        mId = mCreationTime = System.currentTimeMillis();
        mColor = color;
    }

    public long getId() {
        return mId;
    }

    public int getColor() {
        return mColor;
    }

    public void setColor(int color) {
        if (mColor != color) {
            mColor = color;
            mHexString = makeHexString(mColor);
            mRgbString = makeRgbString(mColor);
            mHsvString = makeHsvString(mColor);
        }
    }

    public long getCreationTime() {
        return mCreationTime;
    }

    public String getHexString() {
        if (mHexString == null) {
            mHexString = makeHexString(mColor);
        }
        return mHexString;
    }

    public String getRgbString() {
        if (mRgbString == null) {
            mRgbString = makeRgbString(mColor);
        }
        return mRgbString;
    }

    public String getHsvString() {
        if (mHsvString == null) {
            mHsvString = makeHsvString(mColor);
        }
        return mHsvString;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    public static String makeHexString(int value) {
        return "#" + Integer.toHexString(value).substring(2);
    }

    public static String makeRgbString(int value) {
        return "rgb(" + Color.red(value) + ", " + Color.green(value) + ", " + Color.blue(value) + ")";
    }

    public static String makeHsvString(int value) {
        float[] hsv = new float[3];
        Color.colorToHSV(value, hsv);
        return "hsv(" + (int) hsv[0] + "°, " + (int) (hsv[1] * 100) + "%, " + (int) (hsv[2] * 100) + "%)";
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(this.mId);
        dest.writeInt(this.mColor);
        dest.writeLong(this.mCreationTime);
        dest.writeString(this.mName);
    }

    public static final Creator<ColorItem> CREATOR = new Creator<ColorItem>() {
        public ColorItem createFromParcel(Parcel source) {
            return new ColorItem(source);
        }

        public ColorItem[] newArray(int size) {
            return new ColorItem[size];
        }
    };
}

3 个答案:

答案 0 :(得分:0)

以下是一些颜色名称:

public String getColorName(String hexColor) {
    String name = "";
    switch (hexColor.toLowerCase()) {
        case "#ff0000":
            name = "Red";
            break;
        case "#00ff00":
            name = "Green";
            break;
        case "#0000ff":
            name = "Blue";
            break;
        case "#ffffff":
            name = "White";
            break;
        case "#000000":
            name = "Black";
            break;
        default:
            name = "Unknown";
        break;
    }
    return name;
}

答案 1 :(得分:0)

使得这变得非常困难的是,通常我们将颜色描述为特定的十六进制值。有2 ^ 24个不同的十六进制值,但仅约200种已命名的颜色。

您可以做的是使用色块的概念从几何角度进行思考。它具有3个维度,一个代表红色,一个代表蓝色,一个代表绿色。如果您还具有命名颜色的列表以及它们各自包含的R,G和B的数量,则可以将它们视为立方体中的点。然后,对于任何颜色,您都可以找到最接近的点,这将是对颜色的一个很好的估计。但是,这将导致信息丢失,因为在您拥有如此多的可能值(2 ^ 24)之前,而在您只有〜200之后。

为此,您首先需要将十六进制代码解析为一个3-d点,还需要将颜色列表中的每种颜色解析为一个3-d点。例如#ff0024等于[255,0,36]。

现在,您需要遍历命名颜色列表,并找到距您的点的最小距离的颜色名称。我将提供一些伪代码来解释这一点。

int [][] colorPoints = {{255, 255, 255}, {0, 0, 0}, ...};
String [] colorNames = {"white", "black", ...}; // These two arrays have the same length of N

int [] myColor = parseHexTo3dPoint(hexColorString); // Returns int array of length 3

double minDistance = Double.MAX_VALUE;
String closestColorName = colorNames[0];
for (int i = 0; i < colorNames.length; i++){
    int [] color = colorPoints[i];
    double d0 = (color[0] - myColor[0]);
    double d1 = (color[1] - myColor[1]);
    double d2 = (color[2] - myColor[2]);
    double distance = Math.sqrt(d0*d0 + d1*d1 + d2*d2);
    if (distance < minDistance){
        minDistance = distance;
        closestColorName = colorNames[i];
    }
}

return closestColorName;

答案 2 :(得分:-2)

尝试Color类方法:

public static int parseColor (String colorString)

来自Android文档:

  

支持的格式为:#RRGGBB #AARRGGBB'红色','蓝色','绿色',   '黑色','白色','灰色','青色','品红色','黄色','浅灰色',   'darkgray'

例如:-

int myColor = Color.parseColor("#3F51B5");
myView.setBackgroundColor(myColor);

根据您的代码:

public static int makeHexString(int value) {
int myColor = Color.parseColor("#" + 
Integer.toHexString(value).substring(2));
return myColor;
}