将类型int[]转换为int**

本文关键字:int 转换 类型 | 更新日期: 2023-09-27 18:22:37

我在玩图像中的像素。。

我有什么:

int w; // width
int h; // height
unsafe private int **pData; // pixel data

我希望能够设置pData的高度和宽度。。。因此类似于以下内容:

 pData = new int*[w]; 
 for(int x = 0; x<w; x++)
    pData = new int*[h]; 

这会导致一个错误("无法隐式地将int[]转换为int**)。我该如何在C#中执行此操作?我知道这在C和C++中会起作用…

我想我正在寻找的是一个等价于C#中的上述内容。。。如在C++中所写

将类型int[]转换为int**

不能用这种方式初始化缓冲区。你可以这样做:

class MyImage
{
    Int32[] _Buffer;
    Int32* _Pointer;
    GCHandle _Handle;
    public MyImage() {
        _Buffer = new Int32[w * h];
        _Handle = GCHandle.Alloc(_Buffer, GCHandleType.Pinned);
        _Pointer = (Int32*)_Handle.AddrOfPinnedObject().ToPointer();
    }
}

但不要这样做,这将阻止GC完成它的工作。每次访问缓冲区时最好使用fixed。

图像

在处理图像时,您应该使用Int32[],因为Int32[,]较慢(请参阅msdn)。您可以通过以下方式简单地创建和修改图像:

Int32[] buffer = new Int32[width * height];

访问:

buffer[x + (width * y)] ...

所以你只想要一个像素网格?

在C#中,您可以只使用多维数组或数组数组,例如

private int[,] pixelData = new int[w, h];
// (Might have confused some variables here)
private int[][] pixelData = new int[w][];
for (int i = 0; i < w; i++) pixelData[i] = new int[h];