图像比较属性.资源.图像

本文关键字:图像 资源 比较 属性 | 更新日期: 2023-09-27 18:19:01

你能告诉我为什么下面的条件是假的吗?

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

即使我写:

SelectedImages[0] = Properties.Resources.my_image;
if (SelectedImages[0] == Properties.Resources.my_image)     // false
{
    ...
}

我怎样才能使这个比较起作用?

图像比较属性.资源.图像

它们不相等,因为属性。资源生成图像的副本,并将该副本返回给代码。每次你得到那个图像,你都在创建一个全新的image对象。它创建了一个副本,因为资源通常应该表现得像常量。如果你(例如)以某种方式修改了图片,你不会希望你的代码改变图片。

那么你的代码中发生了什么?你最终会比较两个不同的图像对象,它们碰巧包含相同的数据,. net看到你有两个不同的对象并返回false。它不会进行"深度"比较,以查看对象是否具有相同的数据/状态。

这里有一篇文章的链接,解释了在高层发生了什么:https://navaneethkn.wordpress.com/2009/10/15/understanding-equality-and-object-comparison-in-net-framework/

解决问题的一个快速方法是逐像素比较资源图像和您的selecteimage图像,看看它们是否"相等"。这显然表现不佳。另一种更有效的方法可能是构建一个字典,并使用键来跟踪图像的原始来源。

在Image对象中使用Tag属性。你可以在里面存放任何你想要的东西。就像这样设置你的图像…

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
}