还在为 Graphics.DrawImage 速度慢的问题发愁吗,请看这里

这是本人来CSDN首次写文章,请大家多关照。最近在公司做一个.NET下的SCADA程序,语言是C#,动画部分使用的是GDI+和Timer来绘制。在画图片的时候使用的是强大的Graphics类的DrawImage(DrawImageUnScaled),但是感觉不是一般的慢,这个时候想起以前在C+SDK时使用的BitBlt,效率很高,于是参考了一些资料并整理如下代码供大家参考:

 

using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace BitBltTest { public partial class Form1 : Form { [DllImport("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, //目标设备的句柄 int nXDest, // 目标对象的左上角的X坐标 int nYDest, // 目标对象的左上角的X坐标 int nWidth, // 目标对象的矩形的宽度 int nHeight, // 目标对象的矩形的长度 IntPtr hdcSrc, // 源设备的句柄 int nXSrc, // 源对象的左上角的X坐标 int nYSrc, // 源对象的左上角的X坐标 int dwRop // 光栅的操作值 ); public const int SRCCOPY = 0xCC0020; [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] public static extern IntPtr CreateCompatibleDC(IntPtr hdcPtr); [DllImport("gdi32.dll", ExactSpelling = true)] public static extern IntPtr SelectObject(IntPtr hdcPtr, IntPtr hObject); [DllImport("gdi32.dll", ExactSpelling = true)] public static extern bool DeleteDC(IntPtr hdcPtr); [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); Bitmap bmp; // 用于保存图片的缓冲 int i; // 统计绘图次数 public Form1() { InitializeComponent(); bmp = new Bitmap(@"C:/IMAGE/3d_os/Main_OS_003.png"); // 这里需要一个有效的完整的图片文件名 Timer t = new Timer(); t.Interval = 1; t.Tick += new EventHandler(t_Tick); t.Enabled = true; } void t_Tick(object sender, EventArgs e) { i++; this.Text = i.ToString(); redraw(); System.Threading.Thread.Sleep(10); } private void redraw() { Graphics clientDC = this.CreateGraphics(); IntPtr hdcPtr = clientDC.GetHdc(); IntPtr memdcPtr = CreateCompatibleDC(hdcPtr); // 创建兼容DC IntPtr bmpPtr = bmp.GetHbitmap(); SelectObject(memdcPtr, bmpPtr); BitBlt(hdcPtr, 0, 0, bmp.Width, bmp.Height, memdcPtr, 0, 0, SRCCOPY); DeleteDC(memdcPtr); // 释放内存 DeleteObject(bmpPtr); // 释放内存 clientDC.ReleaseHdc(hdcPtr); // 释放内存 clientDC.Dispose(); } private void Form1_Paint(object sender, PaintEventArgs e) { redraw(); } } } 

 


你可能感兴趣的:(还在为 Graphics.DrawImage 速度慢的问题发愁吗,请看这里)