如何为照片编辑器制作填充方法?
How to make fill method for photo editor?
我正在 java 中制作像素艺术编辑器,只是为了好玩,但我 运行 遇到了问题。当我尝试制作填充功能时出现问题。这是代码
private void fill(int x, int y){
Color beforeColor = img[x][y];
img[x][y] = foregroundColor;
if(x-1 >= 0){
if(img[x-1][y] == beforeColor){
fill(x-1, y);
}
}
if(x+1 >= 0){
if(img[x+1][y] == beforeColor){
fill(x+1, y);
}
}
if(y-1 >= 0){
if(img[x][y-1] == beforeColor){
fill(x, y-1);
}
}
if(y+1 >= 0){
if(img[x][y+1] == beforeColor){
fill(x, y+1);
}
}
}
img 是一个 awt 颜色对象数组。
此方法主要检查指定像素周围是否有相同颜色的像素,然后对下一个和下一个再次运行该方法,直到整个区域都被填满。
如果您对计算机中的堆栈和递归有所了解,那么您可能会意识到这会很快导致 Whosebugerror 并停止程序。我想弄清楚的是一种绕过递归的方法。有人可以指出我关于递归和 Whosebugerror 的正确方向吗?提前感谢可以提供帮助的人。
也许您可以使用一个列表:最初您用您想要开始的像素填充它。然后你有一个循环迭代直到列表为空。在循环中,您从列表中取出一个像素并检查其颜色。如果颜色匹配,则将其及其邻居重新着色到列表中。如果颜色不匹配,则忽略该像素。所以我会使用一个小助手 class 来存储像素的坐标。所以它可能看起来像这样(一些错误检查,......可能会丢失,但这可能是一种方式):
class PixelCoordinate {
public int x;
public int y;
public PixelCoordinate(int x, int y) {
this.x = x; this.y = y;
}
}
Color beforeColor = img[x][y];
List<PixelCoordinate> worklist = new ArrayList<PixelCoordinate>();
// The pixel to start with
worklist.add(new PixelCoordinate(x, y));
while (worklist.isEmpty() == false) {
// Take one pixel from the list
PixelCoordinate pixel = list.get(0);
list.remove(0);
// Check its color
if (img[x][y].equals(beforeColor) {
// Apply new color
img[x][y] = foregroundColor;
// Check neighbors
if (x-1 >= 0) {
list.add(new PixelCoordinate(x-y, y));
}
// Add other neighbors...
}
}
我正在 java 中制作像素艺术编辑器,只是为了好玩,但我 运行 遇到了问题。当我尝试制作填充功能时出现问题。这是代码
private void fill(int x, int y){
Color beforeColor = img[x][y];
img[x][y] = foregroundColor;
if(x-1 >= 0){
if(img[x-1][y] == beforeColor){
fill(x-1, y);
}
}
if(x+1 >= 0){
if(img[x+1][y] == beforeColor){
fill(x+1, y);
}
}
if(y-1 >= 0){
if(img[x][y-1] == beforeColor){
fill(x, y-1);
}
}
if(y+1 >= 0){
if(img[x][y+1] == beforeColor){
fill(x, y+1);
}
}
}
img 是一个 awt 颜色对象数组。
此方法主要检查指定像素周围是否有相同颜色的像素,然后对下一个和下一个再次运行该方法,直到整个区域都被填满。
如果您对计算机中的堆栈和递归有所了解,那么您可能会意识到这会很快导致 Whosebugerror 并停止程序。我想弄清楚的是一种绕过递归的方法。有人可以指出我关于递归和 Whosebugerror 的正确方向吗?提前感谢可以提供帮助的人。
也许您可以使用一个列表:最初您用您想要开始的像素填充它。然后你有一个循环迭代直到列表为空。在循环中,您从列表中取出一个像素并检查其颜色。如果颜色匹配,则将其及其邻居重新着色到列表中。如果颜色不匹配,则忽略该像素。所以我会使用一个小助手 class 来存储像素的坐标。所以它可能看起来像这样(一些错误检查,......可能会丢失,但这可能是一种方式):
class PixelCoordinate {
public int x;
public int y;
public PixelCoordinate(int x, int y) {
this.x = x; this.y = y;
}
}
Color beforeColor = img[x][y];
List<PixelCoordinate> worklist = new ArrayList<PixelCoordinate>();
// The pixel to start with
worklist.add(new PixelCoordinate(x, y));
while (worklist.isEmpty() == false) {
// Take one pixel from the list
PixelCoordinate pixel = list.get(0);
list.remove(0);
// Check its color
if (img[x][y].equals(beforeColor) {
// Apply new color
img[x][y] = foregroundColor;
// Check neighbors
if (x-1 >= 0) {
list.add(new PixelCoordinate(x-y, y));
}
// Add other neighbors...
}
}