CopyFromScreen затем изменить размер при съемке экрана - PullRequest
0 голосов
/ 05 апреля 2019

Я делаю скриншот экрана 4k, но я хочу, чтобы он был уменьшен до 900x540, прежде чем скопировать его в заданный byte[] buffer, чтобы сделать его быстрее.

Я не могу понять, как изменить размер снятого скриншота.

   public void Screenshot(byte[] buffer)
        {
//full screen width and height                
using (var BMP = new Bitmap(Params.Width, Params.Height))
            {
                using (var g = Graphics.FromImage(BMP))
                {
                    g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.Width, Params.Height), CopyPixelOperation.SourceCopy);

                    g.Flush();

                    var bits = BMP.LockBits(new Rectangle(0, 0, Params.Width, Params.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                    Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);
                    BMP.UnlockBits(bits);
                }
            }
        }

РЕДАКТИРОВАТЬ: После ответа Стефана я попробовал это, но это просто помещает небольшую часть всего экрана в buffer, он просто разрезает его.

 public void Screenshot(byte[] buffer)
    {

        using (var BMP = new Bitmap(Params.TargetWidth, Params.TargetHeight))
        {
            using (var g = Graphics.FromImage(BMP))
            {
                g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.WidthSource, Params.HeightSource), CopyPixelOperation.SourceCopy);
                g.Flush();

                var bits = BMP.LockBits(new Rectangle(0, 0, Params.TargetWidth, Params.TargetHeight), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);

                BMP.UnlockBits(bits);
            }
        }
}

это то, что заканчивается в buffer:

enter image description here

1 Ответ

0 голосов
/ 05 апреля 2019

Если вам не нужны особые требования, вы можете использовать одну из перегрузок конструктора растрового изображения :

Обновление:

Я думаю, что вы получаете частичную копию из-за этого:

using (var BMP = new Bitmap(Params.WidthSource, Params.HeightSource))

и

var bits = BMP.LockBits(
             new Rectangle(0, 0, Params.WidthSource, Params.HeightSource), 
             ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);

в сочетании с:

//where you have access to the BMP.
var resizedBmp = new Bitmap(BMP,Params.TargetWidth, Params.TargetHeight);

Должно работать: -)

Убедитесь, что вы утилизируете его после того, как закончите.

Утилизация важна, полагаться на сборщик мусора неуместно, так как, особенно при работе с большим количеством изображений, сборщик мусора замедляется, а объем памяти увеличивается.

...