由于我正在使用的algorithm接受System.Drawing.Bitmap我只需要一种方法来捕获渲染帧到一个,然后渲染结果,这是远远没有效率,但我有一个解决scheme。
该解决scheme使用WIN API中的PrintWindow。
[DllImport("user32.dll")] public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
如果使用embedded式SharpDX控件作为通过句柄捕捉控件将不会执行,但是捕获父控件(在此情况下为表单)将返回所需的图像。
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); IntPtr hdcBitmap = g.GetHdc(); PrintWindow(Handle, hdcBitmap, 0); g.ReleaseHdc(hdcBitmap); g.Dispose(); // Crop the image to return only the part that we need, without control borders. bmp.Clone(new Rectangle(SharpDXControl.Location.X + 1, SharpDXControl.Location.Y + 1, SharpDXControl.Width - 2, SharpDXControl.Height - 2), bmp.PixelFormat);
为了绘制图像,我创建了一个新的SharpDX.Direct2D1.Bitmap实例,并使用了System.Drawing.Bitmap实例中的像素数据(位)。
SharpDX.Direct2D1.Bitmap dxbmp = new SharpDX.Direct2D1.Bitmap(renderTarget, new SharpDX.Size2(bmpWidth, bmpHeight), new BitmapProperties(renderTarget.PixelFormat)); dxbmp.CopyFromMemory(bmpBits, bmpWidth * 4); renderTarget.DrawBitmap(dxbmp, 1F, SharpDX.Direct2D1.BitmapInterpolationMode.Linear); dxbmp.Dispose();
我正在使用的algorithm是队列 – 线性洪泛填充algorithm的稍微修改版本。