Сравнение ссылок на C # - PullRequest
4 голосов
/ 28 марта 2011

Кто-то знает, что может пойти не так, когда вы пытаетесь сравнить две System.Drawing.Image сущности?

У меня есть IEnumerable<Image> images, который итеративно построен с использованием метода Image.FromFile(path).

Но следующий код дает результат, который я не совсем понимаю:

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

Дело в том, что часть (Do something!) никогда не вызывается.

Отладчик показывает, что у объектов изображений есть свойство с именем nativeImage, которое, как я предполагаю, является необработанным указателем памяти, поскольку System.Drawing.Image реализовано с использованием маршаллинга.

Это памятьуказатель постоянно меняется, и я предполагаю, что здесь происходит какое-то клонирование, но я не могу понять, что я должен делать на самом деле.

Что я делаю неправильно и как я могу на самом делеСравните System.Drawing.Image объекты, взятые из одной последовательности IEnumerable<>, чтобы увидеть, совпадают ли они?

Спасибо.


Обновление

        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))
                {

                }
            }
        }

Без ToList() это явно не сработало, я очень глупый.

Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Помните, что каждый раз, когда вы вызываете GetEnumerator, вы будете видеть новые объекты, возвращаемые для каждого вызова MoveNext. То, что вам нужно сделать, это форсировать итерацию в список.

var imageList = images.ToList();
1 голос
/ 28 марта 2011

По image1 == image2 вы сравниваете только ссылки изображения (не изображение как пиксель за пикселем).

Вызывая Image.FromFile(path), вы создаете новый объект изображения каждый раз, когда вызываете этот метод (даже если путь один и тот же), поэтому они всегда имеют разные ссылки.

Я не знаю, есть ли метод для сравнения изображений попиксельно, но, конечно, вы можете реализовать свой собственный механизм для него (это не выглядит сложно).

...