将截图时间减少到40ms

时间:2019-04-08 16:48:36

标签: c# .net performance image-processing screenshot

我正在截屏,将其缩小至分辨率的50%,以占用更少的空间,然后我将字节放入buffer中,但是不幸的是,此过程花费了太多时间。

当前,对于1920x1080的源分辨率,它需要60到100毫秒,这会导致30fps的输出视频加速,因为我没有足够快地生成屏幕截图。我需要大约40毫秒的时间来制作流畅的视频。

问题:如何应用更快的插值算法或限制所需的运算速度以加快速度?

public void Screenshot(byte[] buffer)
{
    using (var bmp = new Bitmap(Params.SourceWidth, Params.SourceHeight))
    {
        using (var g = Graphics.FromImage(bmp))
        {
            g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.SourceWidth, Params.SourceHeight), CopyPixelOperation.SourceCopy);
            g.Flush();
            using (Bitmap resized = new Bitmap(bmp, new Size(Params.TargetWidth, Params.TargetHeight)))
            {
                var bits = resized.LockBits(new Rectangle(0, 0, Params.TargetWidth, Params.TargetHeight), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);
                resized.UnlockBits(bits);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

此方法很慢,因为您使用的是GDI,GDI不再是Windows中的主要图形API(并且自Windows Vista以来就没有使用)。速度较慢的原因之一是因为它将图像数据从GPU的内存(VRAM)复制到计算机的主内存(RAM),以便可以通过GDI对其进行操作。

如果要对计算机的帧缓冲区进行 fast 操作,请使用DWM API,并且仅在GPU中的缓冲区之间复制内存。通过将它们作为着色器或CUDA程序,您可能还可以真正快速地调整图像大小和执行其他操作。