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

时间:2012-02-06 18:35:16

标签: c# .net image

我正在玩图像中的像素..

我有什么:

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 ++编写的

2 个答案:

答案 0 :(得分:2)

您无法以这种方式初始化缓冲区。你可以这样做:

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)] ...

答案 1 :(得分:1)

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

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

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];