我正在使用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;
问题是当我尝试分配值时,我感觉我不再使用实际的指针了。解锁位后,生成的位图不变(使用数组方法时)。
我对指针很陌生,任何人都可以帮助解释发生了什么以及如何通过使用数组来正确维护指针吗?
答案 0 :(得分:1)
Byte[] RGB = { PixelRow[(x * PIXEL_SIZE) + 2],
PixelRow[(x * PIXEL_SIZE) + 1],
PixelRow[(x * PIXEL_SIZE) + 0] };
您正在根据PixelRow[..]
指向的值创建一个字节数组 - 因为这些是字节 - 值类型 - 您正在创建副本对于每个字节,结果数组与它们来自的图像完全分开。
答案 1 :(得分:1)
猜猜你不能在评论中留下代码:) 尝试像
这样的东西 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;
答案 2 :(得分:0)
您可以覆盖索引运算符并让它执行您喜欢的操作。
更多相关内容: