首页 新闻 会员 周边 捐助

C#Winform的Image怎么判断是否来自同一个图片呢

0
悬赏园豆:20 [已解决问题] 解决于 2018-01-03 11:34

其中picturebox1.image先加载的UpError图片,现在怎么判断是否等于UpError呢

鲁广广的主页 鲁广广 | 初学一级 | 园豆:8
提问于:2018-01-03 09:52
< >
分享
最佳答案
0

你这是Resources里面的,直接判断引用就行了。

—— 前提picturebox1.image来自Resources哈,并且没用clone创建哈。

比如原始就是这么写的:picturebox1.image = Resources.XXX;

 

如果已经是clone创建的,那么就需要比对像素点了。

收获园豆:20
花飘水流兮 | 专家六级 |园豆:13615 | 2018-01-03 10:19

@花飘水流兮: 判断引用怎么写,具体是哪个属性?

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 10:26

@鲁广广: Object.ReferenceEquals

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 10:32

@花飘水流兮: 

 

然后判断结果是不科学的

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 10:37

@鲁广广: 按道理不会哈。不排除Get方法,是否加载后每次给的Copy数据。如果是这样只有判断像素点先。我看看Get是不是里面由克隆返回的。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 10:43

@花飘水流兮: 嗯嗯,因为本来图片的来源我已经知道了,如果还要像素来对比,那么效率太低了

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 10:45

@鲁广广: 


UnmanagedMemoryStream stream = obj as UnmanagedMemoryStream;
if (stream != null & wrapUnmanagedMemStream)
return (object) new UnmanagedMemoryStreamWrapper(stream);

确实可能存在该问题,一直没太注意app的Resource管理存在这个问题。

我粗略查看了一下Bitmap也没有合适的参数,只有先这样——你派生一个Image从,把放置Resource的Name(当然还有Bitmap),然后重载Equal,用Name判断。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 11:00

@鲁广广: 或者你的Resouce如果你不发生改变 —— ;你构建一个自己的资源管理:放置一个Hashmap,有就直接取,没有就先去Resource Load近Hashmap,然后就只需要通过引用判断就行了。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 11:02

@花飘水流兮: 最后采用了把预先把UpError图片放到内存中,然后直接提取picturebox的image的内存长度,长度一致就返回ture来判断了。

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 11:10

@鲁广广: 长度不好,容易和其他图片中标,尤其是做图标的往往多个图片长宽是一样的。按你的思路原本就应该是名字或者引用,既然都放内存了,相比你算是共享读取内存的方式,那么你可以直接引用判断了。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 11:14

@花飘水流兮: 怎么说呢,其实我其他图片都是用高拍机拍的,像素都很高,我要对比的几个图片都是我自己定义的几个出错时的提示图片,所以中标的可能性微乎其微..,算了,先把软件功能实现了,回来再好好研究一下,最好的解决方案还是按照图片的唯一标识来判断是最好的。

     最后,非常感谢,先结帖了

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 11:17

@鲁广广: 

注意命名空间,直接函数拿去equal,会是true的;
internal partial class Resources
{
private static Dictionary<string,Object> _resoucesManager { get; } = new Dictionary<string, object>();

public static T GetResource<T>(string name) where T:class
{
if (_resoucesManager.ContainsKey(name)) return _resoucesManager[name] as T;
var rsFromDll = ResourceManager.GetObject(name, resourceCulture) as T;
if (rsFromDll == null) return null;
_resoucesManager.Add(name,rsFromDll);
return rsFromDll;
}
}

 

当超大量的时候就不要这样子了,必须动态加载,然后用开始提供的方法一,派生类和重载equal

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 11:42

@花飘水流兮: 

 

弱弱的问下  resourceCulture 这个是哪个变量?

鲁广广 | 园豆:8 (初学一级) | 2018-01-03 11:56

@鲁广广: 为多语言准备的。你可以忽略。

花飘水流兮 | 园豆:13615 (专家六级) | 2018-01-03 12:01
其他回答(1)
0

判断图片的路径呢,你可以试试

冰冻千尺 | 园豆:323 (菜鸟二级) | 2018-01-03 10:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册