对于循环过早结束

时间:2013-12-15 03:56:50

标签: c# image-processing for-loop image-manipulation

我已经创建了一个用c#处理图像的程序。出于某种原因,我已经做了几乎最简单的双循环,它拒绝工作。该循环每次都可靠地结束于x = 78和y = 78。我一直在看这个,我无法理解!代码:

try 
{
     for (int y = 0; y < inputHeight; y++)
     {
         for (int x = 0; x < inputWidth; x++)
         {
             if (x == 0 && y == 0)
                 continue;
             int xpix = x;
             int ypix = y;
             Color color = inputImage.GetPixel(xpix, ypix);
             colorBucket[counter] = color.R;
             if (counter < byteSize - 1)
                 colorBucket[counter + 1] = color.G;
             if (counter < byteSize - 2)
                 colorBucket[counter + 2] = color.B;
             counter += 3;        
         }
    }
}
catch (Exception e)
{
    System.Diagnostics.Debugger.Log(1, "Error", e.ToString());
}

Visual Studio特别告诉我两个条件都是正确的,无论循环已经退出的事实,并且它们在循环时也是如此。 colorBucket的大小很大,当计数大约是colorBucket大小的三分之一时,循环就会退出。除此之外,不会抛出任何异常,并且我在catch语句中设置的调试点永远不会被调用。

编辑:图像的宽度和高度为844像素,一旦内部代码被删除,循环仍然会失败。

编辑2:所以我发现了一些非常重要的东西,循环实际上不会过早结束,但不知何故,计数器不等于颜色桶中的颜色数。

2 个答案:

答案 0 :(得分:3)

inputHeightinputWidth的定义似乎不正确。尝试更改循环标题以使用inputImage的属性,如下所示:

for (int y = 0; y < inputImage.Height; y++)
{
    for (int x = 0; x < inputImage.Width; x++)
    {
        ...
    }
}

另一个问题是colorBucket数组的大小:你的循环不能超过其大小的三分之一。例如,如果colorBucket数组的大小为18252,则在抛出异常之前,循环将完全运行78x78次。

答案 1 :(得分:0)

嗯,事实证明,这与我将colorBucket的大小乘以此代码之外的三分之一的事实有关。我知道如果你发现有必要关闭这个问题,因为它对这种情况非常具体。