【问题标题】:C# reshape array 1->2 D without duplicating dataC# reshape array 1->2 D 不重复数据
【发布时间】:2016-10-18 12:30:45
【问题描述】:

我使用的是相机制造商提供的 C# SDK。他们有一个方法:

CaptureImage(struct ExpSettings, ref ushort[] pixelbuffer)

我希望将一维数组像素缓冲区重塑为二维数组。 现在我正在使用Buffer.BlockCopy,正如 Jon Skeet 在 SO 上的一个类似问题中所建议的那样。

但是我在想是否有一种方法(在 C# 中)无需复制实际数据就可以做到这一点。在 C 语言中,我猜你可以使用联合。

你能以某种方式创建一个数组UInt16[,] My2DImageData = new UInt[1000, 1000],然后将数据数组“指向”上面的像素缓冲区吗?

感谢您的宝贵时间。 亲切的问候/亨利克

【问题讨论】:

  • 为什么要它是一个二维数组?从编程的角度来看似乎不合逻辑。宽度/高度足以计算数组内的偏移量。 (offset = (y * width) + x)
  • @JeroenvanLangen 是的,你是对的,这是一个选项。我以前主要使用 MatLab,所以在进行图像处理时我更喜欢 MyImage(y, x) 表示法:-)

标签: c# arrays camera reshape


【解决方案1】:

如果您只对通过索引器访问成员感兴趣并且不想重复数据,则可以使用包装类。

class ArrayWrapper<T>
{
    private readonly T[] _arr;
    private readonly int _w, _h;
    public ArrayWrapper(T[] arr, int w, int h)
    {
        if(arr == null)
            throw new ArgumentNullException("arr");

        if(arr.Length != w*h)
            throw new ArgumentException("Invalid array length", "arr");

        _arr = arr;
        _w = w;
        _h = h;
    }

    public T this[int i, int j]
    {
        get { return _arr[i*_w + j]; }
    }
}

var arr = new[] {
    0,  1,  2,  3, 
    4,  5,  6,  7, 
    8,  9,  10, 11, 
    12, 13, 14, 15 };
var wrapper = new ArrayWrapper<int>(arr, 4, 4);
Console.WriteLine(wrapper[1, 1]); // prints 5

【讨论】:

  • 谢谢!这是一个很好的解决方案。
  • 以前从未听说过索引器,但在 MSDN 上简单查看后,我想我明白了基本概念。再次感谢!
猜你喜欢
  • 2019-10-17
  • 1970-01-01
  • 2021-05-16
  • 2018-02-25
  • 2020-04-15
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多