【发布时间】:2011-03-28 12:31:22
【问题描述】:
我正在开发一个应用程序来平均分割图像网格并将图像居中(基于它们的相似性)。到目前为止,我可以设法修复小尺寸的图像网格,但是每当我尝试更大的“精灵”尺寸(例如 100x100)时,我都会收到 Stack Overflow 错误。
是的,我正在使用递归,但是每当检查一个像素时,我都会设置一个布尔值来停用它,将它复制到一个列表并继续检查其他(在所有方向上),直到列表被填满网格中的图像。我不确定这是否是最好的方法,因为对于每次调用,我都会调用相同的方法 7 次(假设有 7 个相邻像素尚未检查)......直到没有像素需要检查,并且我可以移动到网格中的下一张图片。
我尝试跟踪错误开始发生的位置,它是在检查或多或少 1600 像素并将它们添加到列表之后。 MyPixel 是一个包含 4 个变量的类:x(int)、y(int)、color (Color) 和 checked (bool)
public void processSprite(int i, int j)
{
//OOO
//OXO
//OOO
pixeltemp.Add(new MyPixel(imap.pixels[i, j].x, imap.pixels[i, j].y, imap.pixels[i, j].color));
imap.pixels[i, j].read = true;
//OOO
//OOX
//OOO
try
{
if (!imap.pixels[i + 1, j].read)
{
if (imap.pixels[i + 1, j].color.A == 0) //Found a Border
{
imap.pixels[i + 1, j].read = true;
}
else
{
processSprite(i + 1, j);
}
}
}
//... (code goes on)
}
- pixeltemp 是保存图像
(List<MyPixel>)的临时像素列表 - imap 包含整个图像
(List<MyPixel>)
我想这不是内存问题,因为我的应用只占用了大约 16mb 的顶部。
我的问题是,如果不是无限递归,为什么会出现“堆栈溢出”错误?有没有更简单的方法来做到这一点?我确实认为我的代码看起来很丑,我只是不知道如何让它变得更好。
提前致谢!
【问题讨论】:
-
我不太理解你想要完成的事情。您是否正在尝试拍摄一张大图像并将其拆分为多个相同大小的块?
-
@Lucas 我在一张图片中有不同图片的网格。例如,一个 100x100 的 png 包含 100 个大小为 10x10 像素的图像。假设我有一个图像网格,但它们没有对齐并且具有不同的大小:我试图使它们都具有相同的大小,并根据它们的像素相似度来对齐它们。
标签: c# recursion bitmap stack-overflow image-manipulation