Я пытаюсь получить кадр с помощью библиотек C # и AForge:
...
using AForge.Video
using AForge.Video.DirectShow
namespace Example
{
class Program
{
private static Bitmap mySnap = null;
static void Main(string[] args)
{
snapByte();
}
private static void snapByte()
{
int Counter = 0;
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(videoNewFrame);
videoSource.Start();
do
{
Thread.Sleep(500);
Counter++;
}
while (mySnap == null && Counter < 4);
if (videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource.WaitForStop();
videoSource = null;
}
MemoryStream myStream = new MemoryStream();
mySnap.Save(myStream, ImageFormat.Png);
byte[] snapByteLength = MyStream.ToArray();
int snapLength = snapByteLength.Length;
Console.WriteLine(snapLength);
Console.ReadLine();
myStream.Dispose();
mySnap = null;
snapByte();
}
}
private static void videoNewFrame(object sender, NewFrameEventArgs eventArgs)
{
mySnap = (Bitmap)eventArgs.Frame.Clone();
}
}
}
это точный код, который я использую, я просто изменил обработку байтов изображения, чтобы отобразить длину байта, чтобы упростить ситуацию.
проблема, с которой я сталкиваюсь, заключается в том, что память будет занимать где-то между 1-2 МБ каждый раз, когда делается снимок. Я избавляюсь от всех своих растровых изображений, кроме mySnap, который я возвращаю к нулю. он используется снова, и я должен объявить его глобальным, потому что я использую это в snapByte() и newVideoFrame(), но, поскольку я повторно использую mySnap, я не понимаю, почему он складывается... он должен перезаписываться каждый раз...
Я видел другие ответы, но все они связаны с окном изображения, и ответ состоит в том, чтобы очистить окно изображения перед загрузкой нового изображения. Я полагаю, что делаю здесь то же самое, снова вызывая mySnap=null.. но память все еще накапливается. ..
Спасибо..