当您尝试比较两个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()
,这显然不起作用,我非常愚蠢。
谢谢大家。
答案 0 :(得分:2)
请记住,每次拨打GetEnumerator
时,您都会看到每次拨打MoveNext
时都会返回新对象。您需要做的是强制迭代到列表中。
var imageList = images.ToList();
答案 1 :(得分:1)
通过image1 == image2
,您只是比较图像的参考(不是图像逐像素)。
通过调用Image.FromFile(path)
,每次调用此方法时都会创建新的图像对象(即使路径相同),因此它们总是有不同的引用。
我不知道是否有一种方法可以逐像素地比较图像,但当然你可以为它实现自己的机制(看起来并不困难)。