Хотя я программирую около 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: (
Спасибо !!!