2015-04-29 2 views
0

im пытается сделать программу, которая снимает скриншоты и сравнивает их.C# Растровое изображение уже заблокировано скриншоты

это образец кода

сравнить метод:

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern int memcmp(IntPtr b1, IntPtr b2, UIntPtr count); 


    public bool CompareMemCmp(Bitmap b1, Bitmap b2) 
    { 

     if ((b1 == null) != (b2== null)) return false; 
     // if (b1.Size != b2.Size) return false; 



      var bd1 = b1.LockBits(new Rectangle(new Point(0, 0), b1.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
     var bd2 = b2.LockBits(new Rectangle(new Point(0, 0), b2.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 


      IntPtr bd1scan0 = bd1.Scan0; 
      IntPtr bd2scan0 = bd2.Scan0; 

      int stride = bd1.Stride; 
      int len = stride * b1.Height; 

      return memcmp(bd1scan0, bd2scan0, (UIntPtr)(len)) == 0; 


    } 

Thisis основной код:

private void MainForm_Load(object sender, EventArgs e) 
    { 


     prev = CaptureScreen.GetDesktopImage(); 
     th = new Thread(new ThreadStart(capture)); 
     th.Start(); 
    } 

     private void capture() 
    { 


     while (true) 
     { 

      current = CaptureScreen.GetDesktopImage(); 

      if (CompareMemCmp(prev, current)) 
      { 
       label1.Invoke(new Action(() => label1.Text="changed")); 
       prev = current; 
      } 

      else 
       label1.Invoke(new Action(() => label1.Text = "same")); 

      count++; 

     } 


    } 

им получать странные ошибки Int метода CompareMemCmp на этой линии

var bd1 = b1.LockBits(new Rectangle(new Point(0, 0), b1.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 

Я предполагаю, что это связано с скриншотом. Потому что, когда я сравниваю только 2 изображения из каталога, он отлично работает ... любая идея, как передать их ребятам?

+0

Вы используете эту библиотеку для захвата? http://www.csscript.net/samples/printscreen.cs.txt было бы полезно добавить ссылку на ваш вопрос. –

+1

Какая ошибка странная? Я вижу, что вы блокируете растровые изображения. Где вы их разблокируете? – TaW

ответ

0

Вы должны позвонить UnlockBits() на свое растровое изображение после того, как закончите со сравнением. См. Пример на MSDN.

... 
int stride = bd1.Stride; 
int len = stride * b1.Height; 

b1.UnlockBits(bd1); 
b2.UnlockBits(bd2); 

return memcmp(bd1scan0, bd2scan0, (UIntPtr)(len)) == 0; 
... 
+0

Вы также должны изменить строку 'if ((b1 == null)! = (B2 == null)) return false;' поскольку он не будет возвращаться с false, если обе ссылки являются «null». Я думаю, вы хотели написать: 'if ((b1 == null) || (b2 == null)) return false;' –

Смежные вопросы