Создание массива указателей в C # - PullRequest
1 голос
/ 28 апреля 2011

Я работаю с кодом обработки изображений в 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;

Проблема в том, что когда я пытаюсь присвоить значение, я чувствую, что больше не работаю с указателем. Как только я разблокирую биты, результирующее растровое изображение не изменяется (при использовании метода массива).

Я довольно новичок в указателях, кто-нибудь может объяснить, что происходит и как правильно поддерживать указатели с помощью массива?

Ответы [ 3 ]

1 голос
/ 28 апреля 2011
Byte[] RGB = { PixelRow[(x * PIXEL_SIZE) + 2], 
               PixelRow[(x * PIXEL_SIZE) + 1], 
               PixelRow[(x * PIXEL_SIZE) + 0] };

Вы создаете массив байтов на основе значений, на которые указывает PixelRow[..] - поскольку это байты - тип значения - вы создаете копию для каждого байта и результирующий массив полностью отделен от изображения, с которого они пришли.

1 голос
/ 28 апреля 2011

Думаю, вы не можете оставить код в комментариях :) Попробуйте что-то вроде

 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;
0 голосов
/ 28 апреля 2011

Вы можете переопределить оператор индекса и заставить его делать то, что вам нравится.

Подробнее об этом здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...