2011-07-25 15 views
0

Windowsエクスプローラーのように、WPFのツリービューにファイルとフォルダのアイコンを入力しようとしています。問題は、私はちょうど私は、これは私が得るすべてのファイル/フォルダの新しいアイコンを作成することを前提としてい2つのSystem.Drawing.Iconアイテムを比較する方法

return Imaging.CreateBitmapSourceFromHIcon(icon.Handle, new Int32Rect(0, 0, c.Width, c.Height), BitmapSizeOptions.FromEmptyOptions()); 

を呼び出すコンバータを使用していますので、ロードすることは非常に遅いこと、です。私はManagedWinAPI拡張子の画像を取得します。だから今、私はアイコンを互いに比較できる辞書を使うつもりだった。

しかし、2つのSystem.Drawing.Iconオブジェクトを比較するにはどうすればよいですか?参照は常に異なる(テスト済み)ためです。ピクセルコンパレータは必要ありません。なぜなら、プロセスをスピードアップするとは思わないからです。

Dictionary<byte[], ImageSource> data = new Dictionary<byte[], ImageSource>(); 

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    Icon c = (Icon)value; 
    Bitmap bmp = c.ToBitmap(); 

    // hash the icon 
    ImageConverter converter = new ImageConverter(); 
    byte[] rawIcon = converter.ConvertTo(bmp, typeof(byte[])) as byte[]; 

    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
    byte[] hash = md5.ComputeHash(rawIcon); 

    ImageSource result; 

    data.TryGetValue(hash, out result); 

    if (result == null) 
    { 
     PrintByteArray(hash); // custom method, prints the same values for two folder icons 
     result = Imaging.CreateBitmapSourceFromHIcon(c.Handle, new Int32Rect(0, 0, c.Width, c.Height), BitmapSizeOptions.FromEmptyOptions()); 
     data.Add(hash, result); 
    } 
    else 
    { 
     Console.WriteLine("Found equal icons"); 
    } 

    return result; 
} 
+0

どのアイコンを読み込むかはどのように分かりますか? –

+0

'CreateBitmapSourceFromHIcon'を使うよりもアイコンにアクセスして変換する方が効率的です。これは、アンマネージドアイコンデータを扱うためのものです。 –

+0

@Damien私はこれを見つけられませんでしたが、これはWFP ImageSourceに持っていくようです。 – Marnix

答えて

1

あなたがする必要があるとしている。

更新

考慮に@Roy Dictus'答えを取ると、辞書はまだリストに等しいオブジェクトが存在しないことを私に伝えますビットマップを比較するか、ビットマップに基づいてハッシュ値を計算して比較します。

This post on Visual C#キックスは、ビットマップからハッシュ値を計算する方法を示しています。

EDIT: OPは彼の質問を変更する方法に基づいていくつかの追加情報:

を私は辞書のキーとして[]バイトを使用することはありません - 私はIComparableをを実装してよく分かりません。バイト配列をIComparableを実装している文字列に変換することができれば、おそらく動作します。

あなたはそうのような文字列にバイト配列に変換することができます:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < result.Length; i++) 
{ 
    sb.Append(result[i].ToString("X2")); 
} 
+0

素敵な記事です!ハッシングは同じ2つのアイコンに対して同じバイト[]を与えるように見えます。しかし、どういうわけか、私の辞書はまだキーがリストにないと言います。私は私の質問に私の完全な変換方法を掲載します。 – Marnix

0

icon.Handleとして辞書のキーを使用してください。

+1

既にこれを試しましたが、これも(2つのフォルダの場合でも)異なると思われます。 – Marnix