我正在尝试使用文件和文件夹的图标填充WPF中的树视图,就像Windows资源管理器一样。问题是,加载速度非常慢,因为我使用的是只调用
的转换器return Imaging.CreateBitmapSourceFromHIcon(icon.Handle, new Int32Rect(0, 0, c.Width, c.Height), BitmapSizeOptions.FromEmptyOptions());
我认为这会为我得到的每个文件/文件夹创建一个新图标。我检索了ManagedWinAPI
扩展名的图片。所以现在,我打算使用一个可以将图标相互比较的字典。
但是如何比较两个System.Drawing.Icon
个对象呢?因为参考总是不同的(测试)。我不需要像素比较器,因为我认为这不会加速我的过程。
更新
考虑到 @Roy Dictus'的答案,字典仍然告诉我列表中没有相同的对象:
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 :(得分:1)
您将不得不比较位图,或根据位图计算哈希值,然后进行比较。
Visual C#Kicks上的This post向您展示了如何从位图计算哈希值。
编辑:根据OP如何修改他的问题的一些额外信息:
我不会使用byte []作为字典键 - 我不确定是否实现了IComparable。如果你可以将字节数组转换为实现IComparable的字符串,那么它可能会起作用。
您可以将字节数组转换为字符串,如下所示:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sb.Append(result[i].ToString("X2"));
}
答案 1 :(得分:0)
使用icon.Handle
作为字典键。