【发布时间】:2011-04-28 01:31:09
【问题描述】:
我正在使用 C# 中的一些图像处理代码。因为性能至关重要,所以我在不安全的代码中使用指针来执行此操作。
这是我的问题之前的一些代码:
Rectangle Image_Rectangle = new Rectangle(0, 0, MyImage.Width, MyImage.Height);
BitmapData Image_Data = MyImage.LockBits(Image_Rectangle, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
// ... x and y nested for-loops to work with each pixel
Byte* PixelRow = (Byte*)Image_Data.Scan0 + (y * Image_Data.Stride);
一旦我有了上面的字节指针,我就可以像这样设置它的值:
PixelRow[(x * 3) + 2] = 255;
PixelRow[(x * 3) + 1] = 255;
PixelRow[(x * 3)] = 255;
但是,我更愿意将这些作为数组访问:
Byte[] RGB = { PixelRow[(x * PIXEL_SIZE) + 2], PixelRow[(x * PIXEL_SIZE) + 1], PixelRow[(x * PIXEL_SIZE) + 0] };
RGB[0] = 255;
RGB[1] = 255;
RGB[2] = 255;
问题是当我尝试分配值时,我感觉我不再使用实际的指针了。解锁位后,生成的位图不变(使用数组方法时)。
我对指针很陌生,谁能帮助解释发生了什么以及如何通过使用数组来正确维护指针?
【问题讨论】:
-
你确定你不是在重新发明轮子吗?
-
我没有在 C# 中使用过指针,但我怀疑您在捕获指针与指向的值时遇到了问题。第一种访问方法可能有效,因为它正在计算内存地址,然后在该位置设置值 255。在第二种风格中,我相信它是取消引用指针并将值存储在一个新的字节数组中。因此,当您设置值时,您将其设置为堆栈上的存储副本,而不是您想要更改的堆上的实际内存。