我试图通过每隔x
毫秒的窗口截图来创build一个特定窗口的简单video录制(然后将所有这些图像结合在一个AVI文件中),但我不知道如何定义x
的值。 我如何定义它? 这是什么常见的价值? 我读了一些关于24fps的东西。
我也不确定是否使用Timer
,在Tick
事件中捕获是一个好主意。 我会有什么不准确的,我应该使用别的东西? 例如,由于任何原因,屏幕拍摄花费比预期要长的时间。
我目前的实现是这样的:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool GetWindowRect(IntPtr hWnd, out RECT r); public Bitmap GetScreenshot(IntPtr hwnd) { RECT rc; if (!GetWindowRect(hwnd, out rc)) throw new Win32Exception(Marshal.GetLastWin32Error()); Bitmap bmp = new Bitmap(rc.right - rc.left, rc.bottom - rc.top, PixelFormat.Format32bppArgb); using (var gfxBmp = Graphics.FromImage(bmp)) { IntPtr hdcBitmap = gfxBmp.GetHdc(); bool succeeded = PrintWindow(hwnd, hdcBitmap, 0); gfxBmp.ReleaseHdc(hdcBitmap); if (!succeeded) { gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size)); } IntPtr hRgn = CreateRectRgn(0, 0, 0, 0); GetWindowRgn(hwnd, hRgn); Region region = Region.FromHrgn(hRgn); if (!region.IsEmpty(gfxBmp)) { gfxBmp.ExcludeClip(region); gfxBmp.Clear(Color.Transparent); } return bmp; } }
和
int i = 0; const string dest_path = @"C:\Users\pc2\Desktop\images"; void doRecord() { string filename = Path.Combine(dest_path, string.Format("{0}.png", ++i)); // yeah, I'll add some error checking here soon as it gets working. GetScreenshot(handle).Save(filename, ImageFormat.Png); }
在定时器的tick事件中,我称之为:
private void timer1_Tick(object sender, EventArgs e) { doRecord(); }
另外如何正确定义x
价值,我错过了什么?
您必须为您正在使用的计时器设置“间隔”参数。 “时间间隔”以毫秒为单位设置,所以如果您希望有一个〜24 FPS,将“时间间隔”设置为42(1000(毫秒)/ 24(所需的FPS)= 42)。