【发布时间】:2014-11-03 17:41:28
【问题描述】:
下面的代码似乎不起作用。该函数的目标是将位图(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 像素将其写入数组之后,然后在之后的迭代中覆盖运动块。
我认为这不是正确的方法,但是当我在 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;
}
【问题讨论】:
-
您需要告诉我们它是如何不工作的吗?您期望什么,实际得到什么?
-
@ChrisDunaway 好的会编辑
-
我不认为你想要第二个
teller++ -
block.X和block.Y属性代表什么?以第一块为例应该(block.X, block.Y)等于(0, 0)或者(7, 7) -
@Jonesy 是的,谢谢。
标签: c# for-loop logic instance