2

我正在尝试创建一个 C# 函数,该函数从屏幕截图位图中返回每四个像素的 R、G 和 B 值。这是我的代码的一部分。

for (int ix = 4; ix < 1366; ix = ix + 4)
{
    x = x + 4;

    for (int iy = 3; iy < 768; iy = iy + 4)
    {
        y = y + 4;
                      
        System.Drawing.Color pixelcolor = screenshot.GetPixel(x,y);
        red = kolorpiksela.R;
        green = kolorpiksela.G;
        blue = kolorpiksela.B;

        sumR = sumR + red;
        sumG = sumG + green;
        sumB = sumB + blue;                
    }
}

screenshot位图在哪里。最后,“总和”值除以像素数。我的问题是它不起作用。我得到的错误是:

System.Drawing.dll 中出现“System.ArgumentOutOfRangeException”类型的未处理异常

附加信息:参数必须为正且 < 高度。

我认为错误的原因是pixelcolor应该在每一步都重置,但我在过去 2 天尝试这样做。没有成功。

4

3 回答 3

0

我假设你的位图是 1366 x 768。

在您的 ix 循环中,第一次迭代 ix = 4。在第 431 次迭代 ix = 1364,所以它进入循环。

问题是您随后将 4 添加到 x (因此 x = 1368),这超出了您的 1366 边界。

对位图尺寸进行硬编码并不是最好的方法,但您可以快速检查是否 x = x + 4 超过 1366 边界。

768 的 iy 循环几乎相同。

于 2012-10-30T20:30:24.150 回答
0

尝试这个:

for (int x = 0; x < screenshot.Width; x += 4)
{
    for (int y = 0; y < screenshot.Height; y += 4)
    {
        Color pixelcolor = screenshot.GetPixel(x, y);
        sumR += pixelcolor.R;
        sumG += pixelcolor.G;
        sumB += pixelcolor.B;
    }
}
于 2012-10-30T20:31:23.293 回答
0

我只是不知道这里发生了什么:

for (int ix = 4; ix < 1366; ix = ix +4 )
{
    x = x + 4;

    for (int iy = 3; iy < 768; iy = iy + 4)
    {
        y = y + 4;

我的猜测是它应该看起来像:

for (int x = 0; x < screenshot.Width; x += 4 )
{
    for (int y = 0; y < screenshot.Height; y += 4)
    {
        System.Drawing.Color pixelcolor = screenshot.GetPixel(x,y);

尽量不要在不必要的时候硬输入值。我什至可能会将那个“4”变成某个地方的 const 或属性。

于 2012-10-30T20:26:12.990 回答