2011-03-28 2 views
4

두 개의 System.Drawing.Image 엔티티를 비교하려고하면 어떤 일이 잘못 될지 알 수 있습니까?C# 참조 비교

나는 메서드를 사용하여 반복적으로 구성되는 IEnumerable<Image> images 일부가 있습니다.

그러나 다음 코드는 내가 아주 이해할 수없는 결과를 얻을 수 :

foreach (var image1 in images) 
{ 
    foreach (var image2 in images) 
    { 
     if (image1 == image2) 
     { 
      // (Do something!) 
     } 
    } 
} 

건은 (Do something!) 부분이 호출되지 없구요 것입니다. System.Drawing.Image가 마샬링을 사용하여 구현되기 때문에

디버거 화상 오브젝트 I 원시 메모리 포인터 가정 같이 nativeImage라는 특성을 가지고 있음을 보여준다.

메모리 포인터은 항상 변경되며 여기에서 일종의 복제가 발생한다고 생각하지만 실제로 무엇을해야하는지 이해할 수 없습니다.

무엇이 잘못 되었습니까? IEnumerable<> 시퀀스에서 가져온 System.Drawing.Image 개체를 실제로 어떻게 비교할 수 있습니까?

고맙습니다. 이 분명히 작동하지 않았다


업데이트 ToList()없이

 var paths = new List<String> {"Tests/1_1.jpg", "Tests/1_2.jpg"}; 
     IEnumerable<Image> images = paths.Select(path => Image.FromFile(path)).ToList(); 

     foreach (var image1 in images) 
     { 
      foreach (var image2 in images) 
      { 
       if (ReferenceEquals(image1, image2)) 
       { 

       } 
      } 
     } 

은 정말 바보입니다.

모두에게 감사드립니다.

+0

실제로 ** 동일한 ** 이미지를 비교하고있는 이미지가 있습니까? – gideon

+0

@ giddy 네, 서로 다른 크기의 두 이미지로 확인했습니다. * 분명히 같은 이미지를 가리 키지 만 다른 객체로 취급됩니다. * –

+1

'Image.Equals'의 기능은 무엇입니까? – khachik

답변

2

GetEnumerator에 전화 할 때마다 MoveNext을 호출 할 때마다 새 개체가 반환됩니다. 당신이해야 할 일은 반복을 강제적으로 목록에 넣는 것입니다.

var imageList = images.ToList(); 
+0

그래, 그게 내가 f * ked. 고마워요.) –

+0

@ Yippie - 문제 없습니다. – ChaosPandion

1

image1 == image2은 이미지 참조 (픽셀 단위의 이미지가 아님) 만 비교합니다.

Image.FromFile(path)을 호출하면이 방법을 호출 할 때마다 (경로가 동일하더라도) 새 이미지 객체가 만들어 지므로 항상 다른 참조를 갖게됩니다.

이미지를 픽셀 단위로 비교하는 방법이 있는지는 잘 모르겠지만 당연히 자신의 메커니즘을 구현할 수 있습니다 (어렵지 않게 보입니다).