【问题标题】:Hex String to Color name [duplicate]十六进制字符串到颜色名称[重复]
【发布时间】:2018-12-21 04:42:48
【问题描述】:

这不是一个重复的问题,我知道有些问题和我的一样,但我需要有关如何在我的应用中实施的帮助。

我正在尝试制作一个可以捕获颜色的 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];
        }
    };
}

【问题讨论】:

  • 你想要颜色的十六进制代码名称吗?
  • 是的,请!我希望能够在我的应用程序上显示颜色的名称,而不是十六进制值或 RGB
  • 你能举个例子说明一下吗?
  • 例如,我的应用程序选择了屏幕中心的颜色,但我能够以 RGB、HEX 和 HSV 进行捕捉,但我真正想要的是它会自动显示名称颜色,而不是前面提到的那些值。我想过做,就像一个颜色范围是那个特定的名字,但我不知道如何应用它,帮助!
  • 您是否尝试为来自 #XXXXXX 十六进制字符串的超过 1600 万种颜色中的每一种生成名称?例如,您希望#FFFFFE 取什么名字?

标签: java android android-studio android-activity


【解决方案1】:

这里有几个颜色名称:

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;
}

【讨论】:

    【解决方案2】:

    真正困难的是,我们通常将颜色描述为特定的十六进制值。有 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;
    

    【讨论】:

      【解决方案3】:

      试试Color类方法:

      public static int parseColor (String colorString)
      

      来自 Android 文档:

      支持的格式有:#RRGGBB #AARRGGBB 'red'、'blue'、'green'、 “黑色”、“白色”、“灰色”、“青色”、“洋红色”、“黄色”、“浅灰色”、 '深灰色'

      例如:-

      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;
      }
      

      【讨论】:

      • 但我希望它从我的相机中获取一个值并显示这样的颜色 public static String makeHexString(int value) { return "#" + Integer.toHexString(value).substring(2) ;} 它返回 Integer.toHexString(value) 我想要一个名字
      • OP 正在尝试将十六进制值转换为像“red”这样的字符串,而不是像你在这里做的那样
      • 我已经更新了答案。请检查@Pedro Grilo
      • 您仍在转换为 int,而不是 String。查看副本上的答案:stackoverflow.com/questions/4126029/…
      • @Krease 怎么实现cindyxiaoxiaoli代码挖矿?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      相关资源
      最近更新 更多