Как сравнить два элемента System.Drawing.Icon - PullRequest
0 голосов
/ 25 июля 2011

Я пытаюсь заполнить древовидную структуру в 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 ]

1 голос
/ 25 июля 2011

Вам нужно будет либо сравнить битовые карты, либо вычислить значения хеш-функций на основе битовых карт, а затем сравнить их.

В этом посте о Visual C # Kicks показано, как вычислить значение хеш-функции из растрового изображения.

РЕДАКТИРОВАТЬ: Некоторая дополнительная информация, основанная на том, как ОП изменил свой вопрос:

Я бы не использовал byte [] в качестве ключа словаря - я не уверен, что реализует IComparable. Если вы можете преобразовать байтовый массив в строку, которая реализует IComparable, то это, вероятно, сработает.

Вы можете преобразовать байтовый массив в строку следующим образом:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
    sb.Append(result[i].ToString("X2"));
}
0 голосов
/ 25 июля 2011

Используйте icon.Handle в качестве словарного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...