如何从图像中获取所有颜色
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
会把 #
放在它前面
我正在尝试从图像中获取所有颜色或主色。下面是我试过的代码。
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
会把#
放在它前面