2012-12-18 272 views
0

我正在编写一个可以截取截图的应用程序,它需要将它们超快(多个秒)然后处理它们。这里是我用来做它的代码 - 它可以工作,但速度非常慢。截图捕捉速度非常缓慢

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; 
      } 
     } 
    } 
} 
+0

相关:http://stackoverflow.com/questions/1163761/c-sharp-capture-screenshot-of-active-window – Vulcan

+3

你需要做什么与图像?为什么你将整个图像重新复制到另一个“位图”? '位图im1 = CaptureScreen();'应该节省很多时间。和*五*秒?我需要更少的时间来在屏幕截图上运行框模糊......这个屏幕有多大? – Ryan

+1

在我的系统(1680 x 1050分辨率)上运行相同的代码约120ms。 –

回答

0

没关系,用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毫秒的时间;这够了吗?

相关问题