将类型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++中所写
不能用这种方式初始化缓冲区。你可以这样做:
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];