我正在玩图像中的像素..
我有什么:
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 ++编写的
答案 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];