仅在for循环的特定迭代中生成类的实例

本文关键字:实例 for 循环 仅在 迭代 | 更新日期: 2023-09-27 18:28:58

下面的代码似乎不起作用。该函数的目标是将位图(LockBitmap)划分为8乘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像素将其写入数组后,在之后的迭代中覆盖MotionBlock。

我认为这不是正确的方法,但当我在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;
}

仅在for循环的特定迭代中生成类的实例

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

以下是修改后的代码(主要变化是在blockXblockY0时添加了block = new MotionBlock):

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;
}

我相信您在这里想要的只是一个continue语句。

据我所知,当条件

"i mod 8为0,j mod 8是0"

不满意。因此,如果阻止,我建议在末尾添加一个continue

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