Как оптимизировать захват экрана с помощью растрового изображения? - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать программу, которая делает снимок экрана и отображает его в форме WPF.

Я пытаюсь получить не менее 30 кадров в секунду, но у меня проблема с производительностью.

Я получаю снимок экрана с помощью CopyFromScreen, а затем обрабатываю его для отображения на элементе управления изображением.

Всякий раз, когда я запускаю программу, мышь кажется «тяжелой» или она становится менее чувствительной.

Исходя из моих наблюдений, загрузка процессора возрастает всякий раз, когда я вызываю функцию.

Как мне достичь 30 FPS? Я читал о WriteableBitmap, но не могу понять, как включить его в свой текущий код. Вот мой текущий код:

     private void ScreenCapture(object sender, EventArgs e)
    {
        System.GC.Collect();
        using (Bitmap backgroundImage = new Bitmap(this.auxScreen.Bounds.Width, this.auxScreen.Bounds.Height))
        {

            using (Graphics gBackgroundImage = Graphics.FromImage(backgroundImage))
            {
                gBackgroundImage.CopyFromScreen(this.auxScreen.Bounds.X, this.auxScreen.Bounds.Y, 0, 0, backgroundImage.Size);


                if (MainWindowValues.Instance.CurrentMode == MainWindowValues.Modes.PM_Duplicate)
                {

                    CURSORINFO pci;
                    pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(CURSORINFO));

                    if (GetCursorInfo(out pci))
                    {
                        if (pci.flags == CURSOR_SHOWING)
                        {
                            DrawIcon(gBackgroundImage.GetHdc(), Mouse.Instance.Position.X, Mouse.Instance.Position.Y, pci.hCursor);

                            gBackgroundImage.ReleaseHdc();



                        }
                    }
                }
                handleBG = backgroundImage.GetHbitmap();


                    ImageSource bground = Imaging.CreateBitmapSourceFromHBitmap(handleBG, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

                    ImageContainer.Dispatcher.Invoke(() => ImageContainer.Source = bground);



                gBackgroundImage.Dispose();
                DeleteObject(handleBG);


            }

            backgroundImage.Dispose();
        }
        System.GC.WaitForPendingFinalizers();

    }

Спасибо!

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