我已经创建了一个用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:所以我发现了一些非常重要的东西,循环实际上不会过早结束,但不知何故,计数器不等于颜色桶中的颜色数。
答案 0 :(得分:3)
您inputHeight
和inputWidth
的定义似乎不正确。尝试更改循环标题以使用inputImage
的属性,如下所示:
for (int y = 0; y < inputImage.Height; y++)
{
for (int x = 0; x < inputImage.Width; x++)
{
...
}
}
另一个问题是colorBucket
数组的大小:你的循环不能超过其大小的三分之一。例如,如果colorBucket
数组的大小为18252,则在抛出异常之前,循环将完全运行78x78次。
答案 1 :(得分:0)
嗯,事实证明,这与我将colorBucket的大小乘以此代码之外的三分之一的事实有关。我知道如果你发现有必要关闭这个问题,因为它对这种情况非常具体。