以下代码似乎不起作用。该函数的目标是将位图(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;
}
答案 0 :(得分:2)
我认为您需要在x
和y
为0
时声明新的阻止,否则您将不断更新相同的block
。此外,您不需要在Height
循环结束时两次递增索引。最后,为了便于阅读,使用比i
,j
,r
和k
更具描述性的变量名称可能会有所帮助。
以下是修改后的代码(主要更改是在block = new MotionBlock
和blockX
为blockY
时添加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;