仅在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;
}
我认为当x
和y
是0
时,您需要声明一个新的块,否则您将不断更新相同的block
。此外,您不需要在Height
循环结束时将索引增加两次。最后,为了可读性,使用比i
、j
、r
和k
更多的描述性变量名可能会有所帮助。
以下是修改后的代码(主要变化是在blockX
和blockY
为0
时添加了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;