CopyFromScreen然后在截屏时调整大小

时间:2019-04-05 12:39:54

标签: .net resize screenshot

我正在拍摄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);
                }
            }
        }

编辑:在Stefan回答之后,我尝试了一下,但是这只是将整个屏幕的一小部分放在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 :(得分:0)

如果您不需要特殊要求,可以使用bitmap constructor overloads之一:

更新:

我认为您正因为此而获取部分副本:

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);

应该工作:-)

确保完成后将其丢弃。

处理非常重要,因为不适合使用垃圾回收器,因为特别是在处理大量图像时,GC会变慢,并且内存占用量会爆炸。