我有一个带有R,G,B值的颜色列表。下面使用“ Color.rgb(R,G,B)”显示一些数据。然后进行图像处理,当用户触摸图像上的某处时,我获得了该触摸像素的RGB值。如何从我的颜色列表中搜索此RGB值。搜索功能应为:如果列表返回位置或值中存在RGB。如果RGB不存在,则返回列表中最接近的值。我的搜索功能是:
List<Colors> colors;
touchedRGB = bitmap.getPixel(x, y);
for (int i = 0; i < colors.size(); i++) {
Colors color=colors.get(i);
if (touchedRGB==Color.rgb(color.getRcolor(),color.getGcolor(), color.getBcolor())) {
Log.v("OK", "Color found at:"+i);
}
}
它仅检查并返回是否存在颜色不是最接近的颜色。这是颜色列表的代码:
public class Colors {
public int rowid;
public int Rcolor;
public int Gcolor;
public int Bcolor;
public int RGB;
public int getRowid() {
return rowid;
}
public void setRowid(int rowid) {
this.rowid = rowid;
}
public int getRcolor() {
return Rcolor;
}
public void setRcolor(int Rcolor) {
this.Rcolor = Rcolor;
}
public int getGcolor() {
return Gcolor;
}
public void setGcolor(int Gcolor) {
this.Gcolor = Gcolor;
}
public int getBcolor() {
return Bcolor;
}
public void setBcolor(int Bcolor) {
this.Bcolor = Bcolor;
}
}
日志猫:
06-02 04:40:59.911: V/Color(1539): RGB:-2064 R:255 G:247 B:240
06-02 04:40:59.921: V/Color(1539): RGB:-139303 R:253 G:223 B:217
06-02 04:40:59.981: V/Color(1539): RGB:-147017 R:253 G:193 B:183
06-02 04:41:00.031: V/Color(1539): RGB:-352102 R:250 G:160 B:154
06-02 04:41:00.121: V/Color(1539): RGB:-555139 R:247 G:135 B:125
06-02 04:41:00.171: V/Color(1539): RGB:-2136478 R:223 G:102 B:98
06-02 04:41:00.181: V/Color(1539): RGB:-3781045 R:198 G:78 B:75
06-02 04:41:00.221: V/Color(1539): RGB:-197923 R:252 G:250 B:221
06-02 04:41:00.361: V/Color(1539): RGB:-3403 R:255 G:242 B:181
创建一个“距离”功能,该功能可以比较两种颜色并为您提供距离。相等的颜色的距离为0。
根据“最接近的颜色”对您的含义,有很多实现距离的方法。最简单的方法是只使用RGB差异的总和:
public int Distance(Color a, Color b) {
return Math.Abs(a.r - b.r) + Math.Abs(a.g - b.g) + Math.Abs(a.b - b.b);
}
或者,您可以将RGB解释为3D空间中的一个点并获取几何距离,如下所示:
public double Distance(Color a, Color b) {
return Math.Sqrt(Math.Pow(a.r - b.r, 2) + Math.Pow(a.g - b.g, 2) + Math.Pow(a.b - b.b, 2));
}
对于大多数简单的应用程序,这通常已经足够了。如果您想进行更现实的比较,则可以将RGB颜色转换为HSV之类的内容,并且主要根据色相进行比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句