C# 与Properties.Resources.Image的图像比较

C# 与Properties.Resources.Image的图像比较,c#,image,resources,comparison,C#,Image,Resources,Comparison,你能告诉我为什么下列条件是错误的吗 List<Image> SelectedImages = new List<Image>(); SelectedImages.Add(Properties.Resources.my_image); if (SelectedImages[0] == Properties.Resources.my_image) // false { ... } 如何进行比较?它们不相等,因为Properties.Resources生成图像

你能告诉我为什么下列条件是错误的吗

List<Image> SelectedImages = new List<Image>();
SelectedImages.Add(Properties.Resources.my_image);
if (SelectedImages[0] == Properties.Resources.my_image)     // false
{
    ...
}

如何进行比较?

它们不相等,因为Properties.Resources生成图像的副本并将该副本返回给代码。每次你得到那个图像,你实际上是在创建一个全新的图像对象。它创建了一个副本,因为资源的行为通常应该类似于常量。如果(例如)以某种方式修改了图片,则不希望代码更改图片

那么代码中发生了什么?最后比较两个恰好包含相同数据的不同图像对象。NET看到您有两个不同的对象,并返回false。它不会进行“深入”比较以查看对象是否具有相同的数据/状态

下面是一篇文章的链接,该文章解释了高层正在发生的事情:


解决问题的一个快速方法是逐像素比较资源图像和选定的图像图像,看看它们是否“相等”。这显然表现不佳。另一种更有效的方法可能是建立一个字典,并使用一个键来跟踪图像最初来自何处。

它们不相等,因为Properties.Resources生成图像的副本并将该副本返回给代码。每次你得到那个图像,你实际上是在创建一个全新的图像对象。它创建了一个副本,因为资源的行为通常应该类似于常量。如果(例如)以某种方式修改了图片,则不希望代码更改图片

那么代码中发生了什么?最后比较两个恰好包含相同数据的不同图像对象。NET看到您有两个不同的对象,并返回false。它不会进行“深入”比较以查看对象是否具有相同的数据/状态

下面是一篇文章的链接,该文章解释了高层正在发生的事情:


解决问题的一个快速方法是逐像素比较资源图像和选定的图像图像,看看它们是否“相等”。这显然表现不佳。另一种更有效的方法可能是建立一个字典,并使用一个键来跟踪图像最初来自何处。

只需在图像对象中使用
标记
属性即可。你可以在那里储存任何你想要的东西。就像这样设置你的图像

Image img_dbActive = MyApp.Properties.Resources.tray_icon_database_active;
img_dbActive.Tag = "tray_icon_database_active";

Image img_dbIdle = MyApp.Properties.Resources.tray_icon_database_idle;
img_dbIdle.Tag = "tray_icon_database_idle";

ToolStripStatusLabel lbl = new ToolStripStatusLabel("Database is doing something...", img_dbActive);
lbl.Image.Tag = "tray_icon_database_active";

if (lbl.Image.Tag == img_dbActive.Tag)
{
    //Images match
}

只需在图像对象中使用
标记
属性即可。你可以在那里储存任何你想要的东西。就像这样设置你的图像

Image img_dbActive = MyApp.Properties.Resources.tray_icon_database_active;
img_dbActive.Tag = "tray_icon_database_active";

Image img_dbIdle = MyApp.Properties.Resources.tray_icon_database_idle;
img_dbIdle.Tag = "tray_icon_database_idle";

ToolStripStatusLabel lbl = new ToolStripStatusLabel("Database is doing something...", img_dbActive);
lbl.Image.Tag = "tray_icon_database_active";

if (lbl.Image.Tag == img_dbActive.Tag)
{
    //Images match
}

你能更清楚地知道你认为什么是平等的吗?我的意思是,你用什么定义来表示图像平等。如果两个参考相同,图像是否相等?如果我的硬盘上有两个相同的图像,如果这些文件的位相等,这些图像会相等吗?比较没有达到您期望的效果,但我不知道您期望它做什么。那么
Properties.Resources.my_image==Properties.Resources.my_image
呢?这是真的还是假的?<代码>属性>资源。MyOxIsIs=属性。资源。MyIsValue<代码>也是错误的。只需在类构造函数中获得对图像的引用,并将其存储在字段中。我的意思是,你用什么定义来表示图像平等。如果两个参考相同,图像是否相等?如果我的硬盘上有两个相同的图像,如果这些文件的位相等,这些图像会相等吗?比较没有达到您期望的效果,但我不知道您期望它做什么。那么
Properties.Resources.my_image==Properties.Resources.my_image
呢?这是真的还是假的?
Properties.Resources.my_image==Properties.Resources.my_image
也是假的…只需在类构造函数中获取一次对映像的引用并将其存储在字段中。谢谢,这是非常有用的答案。我也在考虑逐像素比较,但首先我想知道是否有更有效的解决方案。两种主要方法是:1)逐像素比较-或-2)设计一个关键系统,以唯一标识阵列中每个图像的位置。谢谢,非常有用的答案。我也在考虑逐像素比较,但首先我想知道是否有更有效的解决方案。两种主要方法是:1)逐像素比较-或-2)设计一个关键系统,以唯一标识阵列中每个图像的位置。