Windows Forms中按钮BackgroundImage比较逻辑失效,如何解决?
你遇到的问题核心在于WinForms里的Image是引用类型,默认用==比较的是对象的引用地址,而不是图片的实际内容。哪怕两张图看起来完全一样,只要它们是不同的Image实例(比如分别从文件加载,或者通过Properties.Resources多次获取),==的结果就会是false,导致你的if判断永远不生效。
解决方案:比较图片的实际内容
我们可以写一个辅助方法,将两张图片转换为字节数组后比较,以此判断它们的内容是否一致:
using System.IO; using System.Linq; using System.Drawing.Imaging; private bool AreImagesEqual(Image img1, Image img2) { // 处理其中一个或两个都为null的情况 if (img1 == null && img2 == null) return true; if (img1 == null || img2 == null) return false; // 将图片保存到内存流,转换为字节数组后比较 using (MemoryStream ms1 = new MemoryStream()) using (MemoryStream ms2 = new MemoryStream()) { img1.Save(ms1, ImageFormat.Png); img2.Save(ms2, ImageFormat.Png); return ms1.ToArray().SequenceEqual(ms2.ToArray()); } }
然后修改你的click方法,调用这个辅助方法来判断:
void click() { if (turn == true) { if (AreImagesEqual(previousButton.BackgroundImage, Bpown.BackgroundImage)) { // 现在这里的代码应该可以正常执行了 } } }
额外注意事项
- 如果你的图片格式不同(比如一个是PNG,一个是JPG),建议统一转换为同一种格式再比较(比如上面代码里的ImageFormat.Png),避免因格式编码差异导致误判。
- 如果按钮背景图是通过
Properties.Resources获取的,要注意每次访问Properties.Resources.xxx都会创建一个新的Image实例,所以直接用==比较也会失败,同样需要用上面的内容比较方法。 - 如果是非常大的图片,字节数组比较可能会有性能问题,这时候可以考虑比较图片的哈希值,或者逐像素比较(但实现起来更复杂),不过按钮背景图一般尺寸较小,字节数组方法完全够用。
内容的提问来源于stack exchange,提问作者user10072612
相关产品推荐
相关产品推荐

