Member 8354645 Ответов: 0

У меня есть небольшое приложение, которое делает снимок с моей веб-камеры. Когда я запускаю его, он занимает почти 1 ГБ памяти компьютера.


У меня есть небольшое приложение, которое делает снимок с моей веб-камеры. когда я запускаю его, он занимает почти 1 ГБ памяти компьютера. такое маленькое приложение не должно занимать так много памяти.

Пожалуйста, кто-нибудь когда-нибудь должен помочь мне в этом.
ниже приведен мой код

Это тот класс, который фотографирует с камеры:

using AForge.Imaging.Filters;
using AForge.Video;
using AForge.Video.DirectShow;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace PictureCapture
{
    public class ImageStore:IDisposable
    {
        public event EventHandler ImageChanged;
        public Image CurrentImage { get; private set; }
        public void StoreImage(Bitmap img)
        {
            //var imageCopy = img.Clone() as Image;
            if (CurrentImage != null) CurrentImage.Dispose();
            CurrentImage = img; //imageCopy;
            //imageCopy.Dispose();
            //img.Dispose();
            if (ImageChanged!=null)
            {
                var args = new EventArgs();
                ImageChanged(this, args);
            }
        }
        void Disposing(bool disposing)
        {
            if (disposing)
            {
                if (CurrentImage != null)
                {
                    ImageChanged -= (s, e)=> { };
                    CurrentImage.Dispose();
                    CurrentImage = null;
                }
            }
        }
        public void Dispose()
        {
            Disposing(true);
            GC.SuppressFinalize(this);
            //return;
        }
    }

    class ImageFromCamera
    {

        //private object timer;
        private FilterInfoCollection videoDevices;
        private VideoCaptureDevice videoSource = null;


        public ImageStore Store { get; private set; }
        public ImageFromCamera(ImageStore store)
        {
            Store = store;
        }
        string _cameraResolution;
        string _cameraInfo;
        //Image _cameraImage;
        public string CameraInfo
        {
            get { return _cameraInfo; }
        }
        public string CameraResolution
        {
            get { return _cameraResolution; }
        }
        //public Image CameraImage
        //{
        //    get { getCamList(); return _cameraImage; }
        //}


        private bool _started = false;
        public void Start()
        {
            if (_started) return;
            getCamList();
        }

        private void getCamList()
        {
            try
            {
                videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                //comboBox1.Items.Clear();
                if (videoDevices.Count == 0)
                {
                    _cameraResolution = "Нет устройства захвата в системе";
                    //throw new ApplicationException();
                }
                else
                {
                    videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
                    try
                    {
                        //Check if the video device provides a list of supported resolutions
                        if (videoSource.VideoCapabilities.Length > 0)
                        {
                            string highestSolution = "0;0";
                            //Search for the highest resolution
                            for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
                            {
                                if (videoSource.VideoCapabilities[i].FrameSize.Width > Convert.ToInt32(highestSolution.Split(';')[0]))
                                    highestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + ";" + i.ToString();
                                
                            }
                            int highResolutionCount = Convert.ToInt32(highestSolution.Split(';')[1]);
                            //Set the highest resolution as active
                            videoSource.VideoResolution = videoSource.VideoCapabilities[highResolutionCount];
                            //videoSource.VideoResolution = videoSource.VideoCapabilities[5];
                            _cameraResolution = "Camera Resolution:" + videoSource.VideoCapabilities[highResolutionCount].FrameSize.Width.ToString() + "x"+ videoSource.VideoCapabilities[highResolutionCount].FrameSize.Height.ToString();
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new ApplicationException("Something went wrong. See inner exception for details", ex);
                    }

                    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
                    Stop();
                    videoSource.Start();
                    //Timer timer = new Timer(1000);
                    //timer.Elapsed += async (sender, e) => await HandleTimer();
                    //timer.Start();

                    _cameraInfo = "устройство работает... " + videoSource.FramesReceived.ToString() + " FPS";
                }
            }
            catch (ApplicationException)
            {
                //DeviceExist = false;
                _cameraResolution = "Нет устройства захвата в системе";
                //comboBox1.Items.Add("No capture device on your system");
            }
        }

        public void Stop()
        {
            if (!(videoSource == null))
                if (videoSource.IsRunning)
                {
                    videoSource.SignalToStop();
                    videoSource = null;
                }
            //throw new NotImplementedException();
        }

        private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap img = (Bitmap)eventArgs.Frame.Clone();
           // using (Bitmap img = (Bitmap)eventArgs.Frame.Clone())
           // {               
            var filll = new Mirror(false, true);
                filll.ApplyInPlace(img);
                Store.StoreImage(img);                 
           // }

            
        }

    }
}


Это мой код для того чтобы поместить картинку в коробки с картинками


public partial class Form1 : Form
   {

       string _fileName;
       ImageStore _store = new ImageStore();
       string _cameraResolution;

       public Form1(ImageStore store, string filemane, string cameraResolution)
       {
          InitializeComponent();
           _fileName = filemane;
          _store = store;

           _cameraResolution = cameraResolution;
           label2.Text = cameraResolution;
           _store.ImageChanged += (s, e) =>
           {
               using (Image _image = (s as ImageStore).CurrentImage)
               {

               Bitmap _cropImage = (Bitmap)_image.Clone();
               Bitmap _cropImage2 = (Bitmap)_image.Clone();
               //Bitmap _getcroppedImage;
              Crop filter = new Crop(new Rectangle(Convert.ToInt32(_cropImage.Width / 2.9), _cropImage.Height / 10, (Convert.ToInt32(_cropImage.Width / 3)), (Convert.ToInt32(_cropImage.Height / 1.2))));
              Bitmap _getcroppedImage = filter.Apply(_cropImage);
                   //Crop filt = new Crop(new Rectangle(120, 80, 380, 320));
              pictureBox1.Image = GetShapesForImage(_cropImage2);
              pictureBox2.Image = _getcroppedImage;
             }

           };
           //_store.ImageChanged -= (s, e) => { };

       }


private Image GetShapesForImage(Bitmap _img)
        {
           // Bitmap _img = (Bitmap)ImageFile.Clone();
            using (Graphics g1 = Graphics.FromImage(_img))
            {

                Pen pen1 = new Pen(Color.FromArgb(160, 255, 160), 2);
                Pen pen2 = new Pen(Color.Red, 2);

                Pen blackPen = new Pen(Color.White, 3);
                blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                // Create rectangle for ellipse.
                
                Rectangle rect = new Rectangle(Convert.ToInt32(_img.Width / 3), _img.Height / 10, (Convert.ToInt32(_img.Width / 3)), (Convert.ToInt32(_img.Height / 1.3)));
                g1.DrawEllipse(blackPen, rect);
                g1.DrawLine(blackPen, _img.Width / 2, 0, _img.Width / 2, _img.Width);
                // Draw ellipse to screen.
                

                g1.DrawLine(blackPen, _img.Width/3.000f, _img.Height/2.000f, _img.Width/1.500f, _img.Height/2.000f);

                //g1.Dispose();
                //pictureBox1.Image = _img;
                return _img;
            }
        }


Что я уже пробовал:

Я пробовал использовать класс() и IDisposable, но это не решило проблему.

[no name]

Вероятно, утечка памяти в AForge, прочтите это : http://stackoverflow.com/questions/15899970/aforge-camera-memory-leak

Member 8354645

Я добавил эту строку кода, но она все та же

если (имя picturebox1.Изображения != нуль)
{
pictureBox2.Изображения.Располагать();
pictureBox1. изображение.Располагать();
}

0 Ответов