仅在for循环的特定迭代中创建类的实例

时间:2014-11-03 17:41:29

标签: c# for-loop logic instance

以下代码似乎不起作用。该函数的目标是将位图(LockBitmap)划分为8 x 8像素的块,并将它们存储在数组中。

我写了一个类MotionBlock,它包含块的X和Y分量以及一个包含位图值的8x8整数。

该函数循环遍历lbmp的width和height属性。每当i mod 8为0且j mod 8为0时,应该生成一个新的motionBlock实例,并且应该分配X和Y属性。对于其他迭代,应将值赋给int数组的灰度值。

在指定最后一个像素的值之后,应该将MotionBlock复制到数组中,并且应该在下一次迭代中创建一个新的MotionBlock(它应该再次两次0 mod 8),重新开始进程直到循环的结束。

问题:数组似乎是空的。在下面的代码中,我尝试在for循环之外创建一个MotionBlock实例,在for循环中使用它,并在每个8x8像素将其写入数组之后,然后在之后的迭代中覆盖运动块。 / p>

我认为这不是正确的方法,但是当我在if语句中创建一个motionBlock的实例时,我不能在if语句之外使用它,所以我找不到一种方法来制作它一个实例,使用它进行几次迭代,将其写入数组,然后继续处理新实例。

public static MotionBlock[] getImageBlocks(LockBitmap lbmp)
{
    int x = lbmp.Width / 8;
    int y = lbmp.Height / 8;
    int surface = x * y;

    MotionBlock[] blocks = new MotionBlock[surface];
    MotionBlock block = new MotionBlock();

    int teller = 0;

    for (int i = 0; i < lbmp.Width; i++)
    {
        for (int j = 0; j < lbmp.Height; j++)
        {
            if (i % 8 == 0 && j % 8 == 0)
            {
                block.X = i;
                block.Y = j;
            }

            int r = i % 8;
            int k = j % 8;

            block.GrayValues[r, k] = lbmp.GetPixel(i, j).R;
            Console.WriteLine(block.grayValues[r, k]);

            if (i % 8 == 7 && i % 8 == 7)
            {
                blocks[teller] = block;
            }

            teller++;
        }

        teller++;
    }

    return blocks;
}

2 个答案:

答案 0 :(得分:2)

我认为您需要在xy0时声明新的阻止,否则您将不断更新相同的block。此外,您不需要在Height循环结束时两次递增索引。最后,为了便于阅读,使用比ijrk更具描述性的变量名称可能会有所帮助。

以下是修改后的代码(主要更改是在block = new MotionBlockblockXblockY时添加0):

public static MotionBlock[] getImageBlocks(LockBitmap lockBitmap)
{
    int surface = (lockBitmap.Width / 8) * (lockBitmap.Height / 8);

    MotionBlock[] blocks = new MotionBlock[surface];
    MotionBlock block = new MotionBlock();

    int blockIndex = 0;

    for (int imageX = 0; imageX < lockBitmap.Width; imageX++)
    {
        for (int imageY = 0; imageY < lockBitmap.Height; imageY++)
        {
            // Get the block-level X and Y coordinates
            int blockX = imageX % 8;
            int blockY = imageY % 8;

            // If we are at the start of a new block, create it
            if (blockX == 0 && blockY == 0)
            {
                block = new MotionBlock {X = imageX, Y = imageY};
            }

            // Set the gray values of the current block and output to console
            block.GrayValues[blockX, blockY] = lockBitmap.GetPixel(imageX, imageY).R;
            Console.WriteLine(block.grayValues[blockX, blockY]);

            // If we are at the end of a block, save it to our array
            if (blockX == 7 && blockY == 7)
            {
                blocks[blockIndex] = block;
            }

            // Increment our block array index
            blockIndex++;
        }
    }

    return blocks;
}

答案 1 :(得分:-2)

我相信你在这里寻找的只是一个继续声明。

根据我的理解,你只想在条件

时忽略循环的给定迭代
  

“i mod 8为0且j mod 8为0”

不满意。因此我建议在此if块的末尾添加一个continue

if (i % 8 == 0 && j % 8 == 0)
    {
        block.X = i;
        block.Y = j;
    }
else
    continue;