我有一张政治 map 图像,我想给上面的国家上色。我将图像加载到 BufferedImage 中,遍历像素并对白色像素进行着色。我正在使用递归方法来填充空白,即使它不是无限的(至少我这么认为)我得到了 StackOverflowError。而且我使用的图像不大,只有 150x160 像素。
这是我的代码。难道我做错了什么?这是否是一个好的方法,我是否应该尝试其他方法?
private final int[] COLORS = {-65536,-15073025,-16726785,-16711757,-16711919,-256,-417268,-455455,-5741663,-14194369,-14730152,-9885900};
private int colorCounter;
private BufferedImage image;
public ImageColoring(BufferedImage image) {
this.image = image;
}
public BufferedImage colorImage(){
for(int i = 0; i<image.getWidth();i++){
for(int j =0;j<image.getHeight();j++){
if(image.getRGB(i,j) == -1){
fill(i,j);
incrementCounter();
}
}
}
return image;
}
private void fill(int x, int y){
if(x<0 || y<0 || x>=image.getWidth() || y>=image.getHeight()) return;
if(image.getRGB(x,y)!=-1) return;
image.setRGB(x,y,COLORS[colorCounter]);
fill(x+1,y);
fill(x-1,y);
fill(x,y+1);
fill(x,y-1);
}
private void incrementCounter(){
if(++colorCounter == COLORS.length) colorCounter = 0;
}
}
我认为你的解决方案本身听起来不错而且简短,问题是一个 y=160 的图像,可以给你的代码创建一个至少大小为 160 y-1 的堆栈,甚至不考虑其他情况。
我建议跳到堆栈密集程度较低的迭代使用。你可以在彼此下面做 4 个不同的循环(不是嵌套的!)。使其可读性较差,但至少占用空间较少。
我是一名优秀的程序员,十分优秀!