繁体   English   中英

C#参考比较

[英]C# reference comparison

当您尝试比较两个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是使用编组实现的。

这个内存指针一直在变化,我猜这里发生了某种克隆,但我无法理解我应该做什么。

我做错了什么,我怎么能真正比较从一个IEnumerable<>序列中获取的System.Drawing.Image对象,看看它们是否相同?

谢谢。


更新

        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() ,这显然不起作用,我非常愚蠢。

感谢大家。

请记住,每次调用GetEnumerator您都会看到每次调用MoveNext返回的新对象。 您需要做的是强制迭代到列表中。

var imageList = images.ToList();

通过image1 == image2您只是比较图像的参考(不是图像逐像素)。

通过调用Image.FromFile(path) ,每次调用此方法时都会创建新的图像对象(即使路径相同),因此它们始终具有不同的引用。

我不知道是否有一种方法可以逐像素地比较图像,但当然你可以为它实现自己的机制(看起来并不困难)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM