【问题标题】:Creating array of pointers in C#在 C# 中创建指针数组
【发布时间】: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。在第二种风格中,我相信它是取消引用指针并将值存储在一个新的字节数组中。因此,当您设置值时,您将其设置为堆栈上的存储副本,而不是您想要更改的堆上的实际内存。

标签: c# arrays pointers


【解决方案1】:
Byte[] RGB = { PixelRow[(x * PIXEL_SIZE) + 2], 
               PixelRow[(x * PIXEL_SIZE) + 1], 
               PixelRow[(x * PIXEL_SIZE) + 0] };

您正在根据 PixelRow[..] 指向的值创建一个字节数组 - 因为这些是字节 - 一种值类型 - 您正在创建一个 副本对于每个字节,生成的数组与它们来自的图像完全分开。

【讨论】:

    【解决方案2】:

    猜你不能在 cmets 中留下代码 :) 尝试类似

     Byte*[] RGB = { &PixelRow[(x * PIXEL_SIZE) + 2], 
                     &PixelRow[(x * PIXEL_SIZE) + 1], 
                     &PixelRow[(x * PIXEL_SIZE) + 0] };
    

    --4/29 编辑

    您可以尝试的另一种方法是获取指向您关注的像素开始的数组索引的指针。然后将其与数组表示法一起使用来访问和更改您关心的红色、绿色和蓝色字节值。现在假设您的像素按顺序存储在数组中,但您可以按如下方式进行:

    Byte* RGB = &PixelRow[x * PIXEL_SIZE];
    RGB[0] = (byte)255;
    RGB[1] = (byte)255;
    RGB[2] = (byte)255;
    

    【讨论】:

    • 不幸的是,这不起作用,尝试分配像这样的值 RGB[0] = 255; 会导致错误(无法将 int 转换为 byte*)。
    • 您可能必须取消引用数组中的指针来设置值。尝试做:*RGB[0] = (byte)255;
    • @JYelton 你能在哪里得到这个工作?我在 LinqPad 中做了一些测试,两种方法都对我有用。
    • 我想我只是在没有数组的情况下完成了它,如果我再次处理项目的那一部分,我将不得不重新考虑你的建议。谢谢!
    【解决方案3】:

    您可以覆盖索引运算符并让它做您喜欢的事情。

    这里有更多信息:

    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/9bec45ef-b471-4dda-92b0-e6c99e82c356/

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2014-02-25
      相关资源
      最近更新 更多