【发布时间】:2013-06-27 21:37:04
【问题描述】:
我正在编写一个填充方法来用红色填充图像(狗的轮廓)。
在我的 TestShellDlg.cpp 中是洪水填充方法。 CTestShellDlg::m_pScreenDib 成员是包含图形并绘制它们的 CDIB32 位图类。
我想对当前像素进行采样,如果它不是黑色(轮廓的颜色),则将其着色为红色。这是 Dib32.cpp 类中预构建的 getter:
void CDIB32::GetRGB(int x, int y, BYTE& r, BYTE& g, BYTE& b)
{
if (x >= Width() || y >= Height())
IERROR;
int off = y * ByteWid() + x * 4;
b = m_pBits[off];
g = m_pBits[off+1];
r = m_pBits[off+2];
}
这是我在 TestShellDlg.cpp 类中的 Floodfill 方法:
void CTestShellDlg::FloodFill(CPoint& mid)
{
byte r,g,b;
//while the current pixel colour is not black, set it to red and recursively loop
m_pScreenDib ->GetRGB(mid.x,mid.y, (byte) r,(byte) g,(byte)b);
while(r !=(byte)0, g !=(byte)0, b !=(byte)0)
{
m_pScreenDib -> SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
mid.x++;
FloodFill(mid);
mid.x--;
FloodFill(mid);
mid.y++;
FloodFill(mid);
mid.y--;
FloodFill(mid);
}
}
在构建和运行项目时,我在 GetRGB() 函数的 IERROR 处得到一个断点。
在堆栈中工作,这发生在 mid.x - 经过几次运行之后。该程序似乎永远无法进入 mid.y++。
我也试过这个作为我的停止条件:
while(mid.x < m_pScreenDib ->Width() && mid.y < m_pScreenDib -> Height())
结果相同。
蜂巢思维中的任何人都可以提供原因和可能的解决方案吗?非常感谢大家。
【问题讨论】:
-
堆栈溢出?请记住,函数调用在堆栈上分配内存,并且堆栈是有限的。你有使用递归吗?
-
好的,谢谢。不,我不必使用递归。这只是我确保覆盖每个像素的方法。我想我将不得不采取不同的策略。谢谢。
标签: c++ visual-c++ flood-fill