[英]Screenshot capture is extremely slow
我正在编写一个可以截取屏幕截图的应用程序,它需要以极快的速度(每秒数秒)来处理它们。 这是我用来执行此操作的代码-可以工作,但是速度非常慢。
using System.Drawing;
using System.Drawing.Imaging;
public static Bitmap CaptureScreen()
{
Bitmap BMP = new Bitmap(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Graphics GFX = System.Drawing.Graphics.FromImage(BMP);
GFX.CopyFromScreen(System.Windows.Forms.Screen.PrimaryScreen.Bounds.X,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Y,
0, 0,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size,
System.Drawing.CopyPixelOperation.SourceCopy);
return BMP;
}
用法-:
Bitmap im1 = new Bitmap(CaptureScreen());
上面的代码可以正常工作,但至少需要5秒钟来处理。 所以有人可以提供一种与上述方法类似的方法,但是速度更快,我也想使用前景窗口而不是整个屏幕进行捕获。
编辑这是比较代码!
private void timer2_Tick(object sender, EventArgs e)
{
pictureBox1.Image = CaptureScreen();
pictureBox2.Image = CaptureScreenOld();
Bitmap im1 = (Bitmap)pictureBox1.Image;
Bitmap im2 = (Bitmap)pictureBox2.Image;
for (int y = 0; y < pictureBox1.Height; y++)
{
for (int x = 0; x < pictureBox1.Width; x++)
{
// Get the color of the current pixel in each bitmap
Color color1 = im1.GetPixel(x, y);
Color color2 = im2.GetPixel(x, y);
// Check if they're the same
if (color1 != color2)
{
// If not, generate a color...
Color myRed = Color.FromArgb(90, 0, 0);
// .. and set the pixel in one of the bitmaps
im2.SetPixel(x, y, myRed);
pictureBox2.Image = im2;
}
}
}
}
好的,多次使用GetPixel
比较像素确实很慢。 而是将您的位锁定到一个数组中:
private static void CompareBitmaps(Bitmap a, Bitmap b) {
Stopwatch sw = new Stopwatch();
sw.Start();
var lockRect = new Rectangle(0, 0, a.Width, a.Height);
BitmapData ad = a.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData bd = b.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Int32[] apixels = new Int32[ad.Width * ad.Height];
Int32[] bpixels = new Int32[bd.Width * bd.Height];
Marshal.Copy(ad.Scan0, apixels, 0, apixels.Length);
Marshal.Copy(bd.Scan0, bpixels, 0, bpixels.Length);
for(int i = 0; i < apixels.Length; i++) {
if(apixels[i] != bpixels[i]) {
unchecked {
bpixels[i] = (int)0xff5a0000;
}
}
}
Marshal.Copy(bpixels, 0, bd.Scan0, bpixels.Length);
a.UnlockBits(ad);
b.UnlockBits(bd);
sw.Stop();
Console.WriteLine("CompareBitmaps took {0}.", sw.Elapsed);
}
我得到的时间约为240毫秒; 够了吗
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.