如何比较两个System.Drawing.Icon项目

时间:2011-07-25 07:41:20

标签: c# comparison icons

我正在尝试使用文件和文件夹的图标填充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;
}

2 个答案:

答案 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作为字典键。