2011-03-28 16 views
4

2つのSystem.Drawing.Imageエンティティを比較しようとすると、何がうまくいかないのか分かりますか?C#参照の比較

Image.FromFile(path)メソッドを使用して繰り返し構成されたIEnumerable<Image> imagesがあります。

しかし、次のコードは、私はかなり理解できない結果が得られます。

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

事が(Do something!)一部が呼ばれることは決してありませんということです。

System.Drawing.Imageがマーシャリングを使用して実装されているため、イメージオブジェクトにはnativeImageというプロパティがあり、未使用のメモリポインタと見なされます。

このメモリポインタはいつも変更されていますが、私はここで何らかのクローニングが起こっていると思いますが、実際に何をすればいいのか理解できません。私が間違って何を

をやっているとどのように私は実際にそれらが同じであるかどうかを確認するために1つの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うん、私は異なる次元の2つの画像でチェックしました。 *明らかに同じ画像を指していますが、異なるオブジェクトとして扱われます。* –

+1

'Image.Equals'とは何ですか? – khachik

答えて

2

GetEnumeratorに電話するたびに、MoveNextへのコールごとに新しいオブジェクトが返されることに注意してください。あなたがする必要があるのは、反復を強制的にリストに入れることです。

var imageList = images.ToList(); 
+0

ええ、それが私がここにいるのです。ありがとうございます) –

+0

@Yippie - 問題ありません。 – ChaosPandion

1

image1 == image2画像の参照(ピクセル単位の画像ではありません)のみを比較しています。

Image.FromFile(path)を呼び出すと、このメソッドを呼び出すたびに(パスが同じであっても)新しいイメージオブジェクトが作成され、常に異なる参照を持つようになります。

イメージをピクセル単位で比較する方法があるかどうかはわかりませんが、もちろん、独自のメカニズムを実装することは難しくありません。

関連する問題