我在尝试对ArrayList
中的Color
进行排序时遇到麻烦。
我正在从该图像中检索所有颜色 imgRed.jpg 我正在使用的代码:
public static ArrayList<Color> getColors(BufferedImage img){
int height = img.getHeight();
int width = img.getWidth();
boolean found = false;
ArrayList<Color> List = new ArrayList<>();
for(int x=0;x<width;x++) {
for(int y=0;y<height;y++) {
found = false;
Color color = new Color(img.getRGB(x, y));
for(Color c : List) {
if(color.getRGB()<c.getRGB()+100 && color.getRGB()>c.getRGB()-100) {
found=true;
}
}
if(!found) {
List.add(color);
}
}
}
return List;
}
收集完所有颜色后,我将它们排序:
Collections.sort(Colors, Comparator.comparing(Color::getRed)
.thenComparing(Color::getGreen)
.thenComparing(Color::getBlue));
随后,我创建了一个包含所有颜色的新图像:
public static void createImage(ArrayList<Color> Colors) {
int width=500;
int height=Colors.size()*10;
BufferedImage b_img = new BufferedImage(width,height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = b_img.createGraphics();
int partialHeight = 0;
int amount = Colors.size();
for(Color c : Colors) {
System.out.println("Colors remaining: "+amount);
graphics.setPaint ( c );
graphics.fillRect ( 0, partialHeight, b_img.getWidth(), partialHeight+10 );
partialHeight = partialHeight + 10;
amount--;
}
File outFile = new File("C:/test/img/out/testColor/outputRed4.png");
try {
ImageIO.write(b_img, "png", outFile);
} catch (IOException e) {
e.printStackTrace();
}
}
此函数产生以下图像:outputRed.png
如您所见,颜色并不是真正分类的。这是因为(我认为)颜色是根据其数值(红色,绿色,蓝色)进行排序的,并且由于我们的观点并没有对RGB数值进行排序。 我记得所生成的图像没有两次颜色,所以该图像中的所有颜色都不相同。
我的问题是:
如何在不出现锯齿状结果的情况下按照每种颜色的所有阴影排序所有颜色?
感谢所有人
答案 0 :(得分:-1)
您遇到的问题来自以下事实:您正在获取3维数据(红色值,绿色值,蓝色值),并试图以1维(仅{{ 1}}参数。
如果首先进行排序(按颜色的红色值,然后按绿色,然后按蓝色),则您收到的输出很可能正是您期望的结果。请记住,此方法仅比较绿色值以对具有相同红色值的颜色进行排序,类似地,仅比较蓝色值以对具有相同红色和蓝色值的颜色进行排序。
它看起来“锯齿状”的原因可能是由于强度的突然变化。假设输入图像在不同强度下几乎完全是红色阴影,那么可能值得使用List
,其中index
定义为:
Comparator.comparing(Color::getTotal)
这将按强度(即亮度)排序,并使图像看起来不那么“锯齿”,但在不仅仅是红色的图像上,颜色将不是“颜色顺序”或“彩虹顺序”。 / p>
同样,这是尝试将3维数据映射到1维空间中的问题。总是要妥协。