如何从图像中获取所有颜色

How to get all the colors from image

我正在尝试从图像中获取所有颜色或主色。下面是我试过的代码。

    public  ArrayList<String> getDominantColorFromImage(Bitmap bitmap)
    {
    ArrayList<String> mArr = new ArrayList<>();

    List<Palette.Swatch> swatchesTemp = Palette.from(bitmap).generate().getSwatches();
    List<Palette.Swatch> swatches = new ArrayList<Palette.Swatch>(swatchesTemp);

    Collections.sort(swatches, new Comparator<Palette.Swatch>() {
        @Override
        public int compare(Palette.Swatch swatch1, Palette.Swatch swatch2) {
        return swatch2.getPopulation() - swatch1.getPopulation();
        }
    });


    int x=0;

    do{
        int[] rgb1 = getRGBArr(swatches.get(x).getRgb());

        Log.d("LogImgcolor", "" + rgb1);

        //String xx1= Integer.toHexString(rgb1[0])  + Integer.toHexString(rgb1[1])  + Integer.toHexString(rgb1[2]);
        String xx1= Integer.toString(rgb1[0], 16)  + Integer.toString(rgb1[1], 16)  + Integer.toString(rgb1[2], 16);
        mArr.add(xx1);
        x++;
    }while( x < swatches.size());

    return mArr;
    }

    public static int[] getRGBArr(int pixel) {

    int red = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue = (pixel) & 0xff;

    return new int[]{red, green, blue};
    }

为了显示每种颜色,我只是在颜色代码字符串中添加“#”。下面是代码:

 String colrCode = "#"+ _eachColorCode;
 mImgVw.setBackgroundColor(Color.parseColor(colrCode));

但问题是它有时会显示错误,特别是当返回的颜色字符串数组列表中的任何值变成“#10a010”或“#8a08”或“#10a08”之类的东西时。

如何解决?有没有更好的选择来从图像中获取颜色?

如果 rgb1[0] 是 8,那么 Integer.toString(rgb1[0], 16) 将是 return 8,而不是 08。

尝试以下:

String xx1 = String.format("#%06X", (0xFFFFFF & swatches.get(x).getRgb()));

哪里

  • %X 将给定的整数格式化为十六进制
  • %6X 将给定的整数格式化为长度为 6 的十六进制;如果转换后的int的长度小于6,那么它会在它前面放一些空格,使它成为6的长度
  • %60X 与上面相同,但它会放置一些零而不是空格
  • #%60X 会把 # 放在它前面