如何在Java中将颜色代码从浅到深排序

时间:2014-09-05 06:51:30

标签: java graphics colors

我在项目中使用了大约30-40种不同的颜色。我在一个阵列上持有这些颜色的十六进制代码并在listview上显示它们。当前列表视图颜色随机列出。

但是我想根据它们从白色到黑色的接近程度对这些颜色进行排序。

当前随机listview链接:

http://tinypic.com/view.php?pic=33ufll3&s=8#.VAiClfmSyXY

我的代码:

public void work(String sub){
       ArrayList<String> colorCodes = new ArrayList<String>();
         ArrayList<String> colorNames = new ArrayList<String>();
         ArrayList<Integer> colors = new ArrayList<Integer>();
         Field [] fields = R.color.class.getDeclaredFields();
         String colorCode;
         String colorName;
         int color;

         final CustomList adapter2 = new CustomList(MainActivity.this,
                    add.colorArray);
         adapter2.clear();
            int number=0;           
            try
            {
                for(int i=0; i<fields.length; i++)
                {                       
                    getResources().getColor(fields[i].getInt(null));

                    colorName = fields[i].getName();
                    colorCode = getResources().getString(fields[i].getInt(null));
                    color = fields[i].getInt(null);
                    System.out.println("COLOR:" +String.valueOf(color));

                    if(fields[i].getName().subSequence(0, 3).equals(sub)){
                    if(!colorCodes.contains(colorCode))
                    {
                        colorCodes.add(colorCode);
                        colorNames.add(colorName);
                        colors.add(color);
                    }            
                }
                }

            }
                catch (Exception ex){}


        number=0;  
        for(int i=0;i<colorCodes.size();i++){


                add.adding(colorCodes.get(i), number+1,colors.get(i));
                number++;     
           }


            add.doCustom(adapter2, (ListView) findViewById(R.id.listView1));
   }

4 个答案:

答案 0 :(得分:2)

我想你需要两件事:颜色列表(例如List<Color> colors)以及根据它们的暗度或亮度来比较颜色的某种方式。 (见:Evaluate whether a HEX value is dark or light)。

例如,如果我们只是比较RGB值的总和(这可能不足以满足您的目的),那么比较顺序将由...建立。

@Override
public int compare(Color c1, Color c2) {
  return Integer.compare(c1.getRed() + c1.getGreen() + c1.getBlue(), c2.getRed() + c2.getGreen() + c2.getBlue());
}

然后实际的排序就是:

Collections.sort(colors, new Comparator<Color>() {
  @Override
  public int compare(Color c1, Color c2) {
    return Integer.compare(c1.getRed() + c1.getGreen() + c1.getBlue(), c2.getRed() + c2.getGreen() + c2.getBlue());
  }
});

这是基于发光的实现:

    Collections.sort(colors, new Comparator<Color>() {
        @Override
        public int compare(Color c1, Color c2) {
            return Float.compare(((float) c1.getRed() * 0.299f + (float) c1.getGreen() * 0.587f
                    + (float) c1.getBlue() * 0.114f) / 256f, ((float) c2.getRed() * 0.299f + (float) c2.getGreen()
                    * 0.587f + (float) c2.getBlue() * 0.114f) / 256f);
        }
    });

答案 1 :(得分:1)

这可能是最简单的方法,但不一定是最准确的方法。有关更准确的方法,请参阅我的其他答案。

将它们转换为HSV并在V上排序 - 这是衡量颜色亮度的指标。请注意,使用HSV的Java方法称之为HSB,只是为了区别。

可能最简单的方法是编写一个Comparator来调用RGBtoHSB类的Color方法,并对每个结果中的第三个数字进行比较。

答案 2 :(得分:1)

来自HSL和HSV的维基百科页面

  

更具感知意义的替代方案是使用亮度,Y'作为亮度维度(图12d)。 Luma是伽马校正的R,G和B的加权平均值,基于它们对感知亮度的贡献,长期用作彩色电视广播中的单色维度。对于Rec。在sRGB中使用的709个原色,Y'709 = 0.21R + 0.72G + 0.07B;对于Rec。 601 NTSC原色,Y'601 = 0.30R + 0.59G + 0.11B;对于其他原色,应使用不同的系数。

因此,如果准确性很重要,我建议您编写一个计算0.21 * R + 0.72 * G + 0.07 * B的比较器并对其进行比较。

答案 3 :(得分:0)

正如您可能知道的那样,#xxxxxx格式的颜色按照红色(前两个十六进制),绿色(中间两个十六进制)和蓝色(最后两个十六进制)的“数量”进行组织。

因此,如果白色为#ffffff而黑色为#000000,则尝试按这三个数字的平均值对颜色进行排序(将红色,蓝色和蓝色的值相加并除以3)