我正在截屏,将其缩小至分辨率的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);
}
}
}
}
答案 0 :(得分:1)
此方法很慢,因为您使用的是GDI,GDI不再是Windows中的主要图形API(并且自Windows Vista以来就没有使用)。速度较慢的原因之一是因为它将图像数据从GPU的内存(VRAM)复制到计算机的主内存(RAM),以便可以通过GDI对其进行操作。
如果要对计算机的帧缓冲区进行 fast 操作,请使用DWM API,并且仅在GPU中的缓冲区之间复制内存。通过将它们作为着色器或CUDA程序,您可能还可以真正快速地调整图像大小和执行其他操作。