C# - 如何从较大的一部分创建一个新的字节数组

时间:2013-08-18 07:14:30

标签: c# byte bytearray

我对编码很新,所以我不确定这是否是一个非常明显的问题。 我所拥有的是一个有序的字节列表,表示与这些像素相关的像素和深度数据,因此当返回到一个框中时,它们会创建一个图像。我要做的是将这些字节的较小矩形隔离成一个新的字节数组。

所以基本上我想跳过数组开头的大量字节(完全在较小的矩形部分之上的字节),以及它左边的第一批,然后添加一行的新数组的较小框的长度,然后跳过框右侧的那些,跳过下一行的左侧,添加长度,向右跳过并重复所有直到我到达框的末尾。

我真的希望不好的解释对某人有意义。我不知道该怎么做。任何帮助都会非常感激!

谢谢!

2 个答案:

答案 0 :(得分:2)

最简单的选择可能是创建一个大小合适的字节数组,然后根据它的声音多次使用Array.CopyBuffer.BlockCopy

我怀疑你需要每行调用一次复制方法,找出源数据中行的相关部分开始的位置,目标数据中行的相关部分开始的位置。现在你已经有了基本的想法,我会把剩下的留给你,但随时可以要求更多的澄清。不要忘记(在你的计算中)“目标”行号不等于“源”行号! (我怀疑在目标行号上循环最简单,并添加一个偏移量......)

答案 1 :(得分:1)

我认为它看起来像这样:

const int numberOfBytesPerPixel = ...;

// input: original data
int originalWidth = ...;
int originalHeight = ...;
byte[] original = ...; // should have the correct size and contain the data

// input: desired position and size for cropping rectangle
int cropOffsetToTheRight = ...;
int cropOffsetDown = ...;
int cropWidth = ...;
int cropHeight = ...;

// get the rectangle:
byte[] crop = new byte[numberOfBytesPerPixel * cropWidth * cropHeight];
for (int rowNumber = 0; rowNumber < cropHeight; ++rowNumber)
{
    Array.Copy(
        original,
        numberOfBytesPerPixel * ((cropOffsetDown + rowNumber) * originalWidth + cropOffsetToTheRight),
        crop,
        numberOfBytesPerPixel * rowNumber,
        numberOfBytesPerPixel * cropWidth
        );
}

以下是the overload of Array.Copy used的文档。