2014-02-08 5 views
2
public void winCheck() 
{ 
    if (button1.Image == img1) 
    { 
     w1 = "P2"; 
     button1.Image = new Bitmap(@"win_cross.png"); 
     button2.Image = new Bitmap(@"win_cross.png"); 
     button3.Image = new Bitmap(@"win_cross.png"); 
    } 
} 

Здесь оба button1.Image и img1 имеют одинаковое изображение, но все же элемент управления не входит в блок if. Является ли их любое свойство обоих таких значений, что значение обоих будет одинаковым.Как сравнить два изображения?

+0

Вы пытаетесь сказать, что образ одинаковы, потому что они немного на бит идентичны (они показывают одно и тоже изображение)? Как инициализировать кнопку button1.Image и переменную img1? – Steve

+0

На самом деле это один и тот же бит изображения на бит, я инициализировал button1.Image в обработчике событий click1, и я создал переменную img1 (Image) (public) в самом основном классе. – k3rn3l

+0

Возможный дубликат [Сравнение изображений] (http://stackoverflow.com/questions/6412778/comparing-images) –

ответ

-5

dont использовать двойной единый (==). использование способ. (если button1.Image.equals (img1)) // Вы код

+1

-1: Растровое изображение не реализует «Равно». Он сравнивает ссылки по умолчанию. – Idov

+0

это дает исключение NullReferenceException. Ссылка на объект не установлена ​​в экземпляр объекта. – k3rn3l

+1

его работы с изображениями @idov –

7

Вот одна возможность сделать это, если вы можете иметь unsafe код, и если вы хотите, чтобы изображения точно такой же на уровне байтов:

public unsafe static bool AreEqual(Bitmap b1, Bitmap b2) 
{ 
    if (b1.Size != b2.Size) 
    { 
     return false; 
    } 

    if (b1.PixelFormat != b2.PixelFormat) 
    { 
     return false; 
    } 

    if (b1.PixelFormat != PixelFormat.Format32bppArgb) 
    { 
     return false; 
    } 

    Rectangle rect = new Rectangle(0, 0, b1.Width, b1.Height); 
    BitmapData data1 
     = b1.LockBits(rect, ImageLockMode.ReadOnly, b1.PixelFormat); 
    BitmapData data2 
     = b2.LockBits(rect, ImageLockMode.ReadOnly, b1.PixelFormat); 

    int* p1 = (int*)data1.Scan0; 
    int* p2 = (int*)data2.Scan0; 
    int byteCount = b1.Height * data1.Stride/4; //only Format32bppArgb 

    bool result = true; 
    for (int i = 0; i < byteCount; ++i) 
    { 
     if (*p1++ != *p2++) 
     { 
      result = false; 
      break; 
     } 
    } 

    b1.UnlockBits(data1); 
    b2.UnlockBits(data2); 

    return result; 
} 

Это сравнение изображений «буквально» - все байты должны быть точно такими же. Другой возможностью было бы сравнить цвета пикселей - то PixelFormat s не будет такой же (из here):

public static CompareResult Compare(Bitmap bmp1, Bitmap bmp2) 
{ 
    CompareResult cr = CompareResult.ciCompareOk; 

    //Test to see if we have the same size of image 
    if (bmp1.Size != bmp2.Size) 
    { 
     cr = CompareResult.ciSizeMismatch; 
    } 
    else 
    { 
     //Sizes are the same so start comparing pixels 
     for (int x = 0; x < bmp1.Width 
      && cr == CompareResult.ciCompareOk; x++) 
     { 
      for (int y = 0; y < bmp1.Height 
         && cr == CompareResult.ciCompareOk; y++) 
      { 
       if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y)) 
        cr = CompareResult.ciPixelMismatch; 
      } 
     } 
    } 
    return cr; 
} 

Это может быть, однако, очень медленно. Та же ссылка содержит интересную идею сравнения хэш-значений:

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Security.Cryptography; 

namespace Imagio 
{ 
    public class ComparingImages 
    { 
     public enum CompareResult 
     { 
      ciCompareOk, 
      ciPixelMismatch, 
      ciSizeMismatch 
     }; 

     public static CompareResult Compare(Bitmap bmp1, Bitmap bmp2) 
     { 
      CompareResult cr = CompareResult.ciCompareOk; 

      //Test to see if we have the same size of image 
      if (bmp1.Size != bmp2.Size) 
      { 
       cr = CompareResult.ciSizeMismatch; 
      } 
      else 
      { 
       //Convert each image to a byte array 
       System.Drawing.ImageConverter ic = 
         new System.Drawing.ImageConverter(); 
       byte[] btImage1 = new byte[1]; 
       btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType()); 
       byte[] btImage2 = new byte[1]; 
       btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType()); 

       //Compute a hash for each image 
       SHA256Managed shaM = new SHA256Managed(); 
       byte[] hash1 = shaM.ComputeHash(btImage1); 
       byte[] hash2 = shaM.ComputeHash(btImage2); 

       //Compare the hash values 
       for (int i = 0; i < hash1.Length && i < hash2.Length 
            && cr == CompareResult.ciCompareOk; i++) 
       { 
        if (hash1[i] != hash2[i]) 
         cr = CompareResult.ciPixelMismatch; 
       } 
      } 
      return cr; 
     } 
    } 
} 
0

Ваш код не работает, потому что вы сравниваете переменные, указывающие на изображение (т.е. в адреса памяти), не данные изображения (пикселей).

См. ImageComparer.Compare method. Имеет перегрузки для указания допуска. Он доступен с VS2012.

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.uitesting.imagecomparer.compare.aspx

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