Утечка памяти Image.RotateFlip: /

Хотя я программирую около 11 лет (в основном VB6, последние 6 месяцев C #), это ВПЕРВЫЕ на самом деле задать вопрос :) Я нашел все свои ответы на interwebz, но эту проблему я не могу решить сам. Ваш сайт - одно из самых полезных мест, откуда я получил лучшие ответы!

Я покажу код, который я использую (отрывок из того, что имеет отношение к делу). Проблема в том, что при использовании метода RotateFlip память быстро увеличивается до ~ 200 МБ, а затем через некоторое время собирается сборщиком мусора. Основной вызывающий его метод повторяется примерно 30 раз в секунду, поэтому производительность здесь имеет первостепенное значение. Я пробовал использовать преобразование графической матрицы, но иногда это не удается, и изображение отображается без переворота. Само приложение основано на использовании веб-камеры, скрытии предварительного просмотра, получении изображения обратного вызова и отображении его в окне изображения. Затем он накладывает прямоугольник на if из другого класса. Это причина использовать обратный вызов, а не окно предварительного просмотра.

Класс Capture.cs:

internal Bitmap LiveImage;

    int ISampleGrabberCB.BufferCB(double bufferSize, IntPtr pBuffer, int bufferLen)
    {
        LiveImage = new Bitmap(_width, _height, _stride, PixelFormat.Format24bppRgb, pBuffer);

        if (ExpImg) // local bool, used rarely when the picture saving is triggered
        {
            LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
            var a = LiveImage.Clone(new Rectangle(Currect.Left, Currect.Top, Currect.Width, Currect.Height),
                                    LiveImage.PixelFormat);
            using (a)
                a.Save("ocr.bmp", ImageFormat.Bmp);

        }
        else // dmnit, rotateflip leaks like h*ll but matrix transform doesn't sometimes flip :S
        {
            LiveImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
            /*using (var g = Graphics.FromImage(LiveImage))
            {
                g.Transform = _mtx;
                g.DrawImage(LiveImage, 0, 0);
            }*/
        }
        GC.Collect(); // gotta use it with rotateflip, otherwise it gets crazy big, like ~200M :O
        return 0;
    }
}

В основной форме у меня есть событие, обновляющее изображение в окне изображения:

private void SetPic()
{
    pctCamera.Image = _cam.LiveImage;
    _cam.PicIsFree = false;
}

Потому что мне нужно вернуть изображение в главную форму который находится в другом классе, тогда я решил, что наиболее логичным является открытое растровое изображение, которое обновляется при каждом кадре обратного вызова. Причина, по которой я не хочу использовать матричное преобразование, заключается в том, что оно медленнее и иногда с такой скоростью не удается перевернуть изображение, и частота такого поведения сильно отличается от разных ПК с разными аппаратными возможностями и скоростями процессора, а также с самой высокой частотой кадров 30 кадров в секунду с процессором 1,2 ГГц показывает это очень часто.

Итак, вы можете помочь мне разобраться? На самом деле я не использую его в текущей версии, я использую преобразование матрицы с комментариями, потому что мне плохо из-за использования GC.Collect: (

Спасибо !!!

6
задан VMAtm 7 July 2011 в 11:18
поделиться