чрезмерное использование памяти при использовании указателей? - PullRequest
1 голос
/ 20 ноября 2010

У меня есть функция, которая принимает цветное растровое изображение и делает его серым, но использование памяти слишком велико.Я использовал метод Marshal.Copy раньше, нет утечки памяти, но она медленнее.Любая помощь?

        Bitmap b = a.Clone(new Rectangle(0, 0, a.Width, a.Height), a.PixelFormat);
        BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
        byte bitsPerPixel = Convert.ToByte(Image.GetPixelFormatSize(bData.PixelFormat));

        /*This time we convert the IntPtr to a ptr*/
        byte* scan0 = (byte*)bData.Scan0.ToPointer();

        //Console.WriteLine(scan0);
        for (int i = 0; i < bData.Height; ++i)
        {
            for (int j = 0; j < bData.Width; ++j)
            {
                byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;

                data[0] = data[1] = data[2] = (byte)((data[0] + data[1] + data[2]) / 3);

            }
        }
        b.UnlockBits(bData);
        bData = null;
        return b;

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Я не знаю об утечке памяти, но есть лучший способ преобразовать изображение в оттенки серого.Посетите эту страницу , и вы найдете три способа сделать это, самый быстрый из которых называется «Короткий и сладкий».И самое приятное.

Внешний сайт недоступен даже в Google и Internet-архиве, но код для краткого и приятного метода приведен в другом ТА ответе .

0 голосов
/ 20 ноября 2010

Если вы хотите писать прямо в указатели памяти из C #, вам нужно использовать «небезопасный код».См. Статью здесь для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

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