首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作图片编辑器的填充方法?

如何制作图片编辑器的填充方法?
EN

Stack Overflow用户
提问于 2015-09-05 21:58:27
回答 1查看 63关注 0票数 1

我正在用java制作一个像素艺术编辑器,只是为了好玩,我遇到了一个问题。这个问题发生在我试图做填充函数的时候。这是代码

代码语言:javascript
复制
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 Color对象的数组。

这种方法基本上是在指定像素周围检查相同颜色的像素,然后在下一次和下一次运行该方法,直到整个区域被填充为止。

如果您了解计算机中的堆栈和递归,那么您可能会意识到这将很快导致堆栈溢出错误并停止程序。我想找出一种绕过递归的方法。有人能告诉我关于递归和堆叠溢出错误的正确方向吗?提前感谢那些能帮忙的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-05 22:16:38

也许你可以使用一个列表:最初你用你想要开始的像素填充它。然后有一个循环,循环到列表为空。在循环中,从列表中提取一个像素并检查其颜色。如果颜色匹配,则重新着色它及其相邻的列表。如果颜色不匹配,忽略像素。所以我会使用一个小助手类来存储像素的坐标。所以看起来可能是这样(一些错误检查,.可能会丢失,但这可能是一段路要走):

代码语言:javascript
复制
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...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32418081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档