你这是Resources里面的,直接判断引用就行了。
—— 前提picturebox1.image来自Resources哈,并且没用clone创建哈。
比如原始就是这么写的:picturebox1.image = Resources.XXX;
如果已经是clone创建的,那么就需要比对像素点了。
@花飘水流兮: 判断引用怎么写,具体是哪个属性?
@鲁广广: Object.ReferenceEquals
@花飘水流兮:
然后判断结果是不科学的
@鲁广广: 按道理不会哈。不排除Get方法,是否加载后每次给的Copy数据。如果是这样只有判断像素点先。我看看Get是不是里面由克隆返回的。
@花飘水流兮: 嗯嗯,因为本来图片的来源我已经知道了,如果还要像素来对比,那么效率太低了
@鲁广广:
UnmanagedMemoryStream stream = obj as UnmanagedMemoryStream;
if (stream != null & wrapUnmanagedMemStream)
return (object) new UnmanagedMemoryStreamWrapper(stream);
确实可能存在该问题,一直没太注意app的Resource管理存在这个问题。
我粗略查看了一下Bitmap也没有合适的参数,只有先这样——你派生一个Image从,把放置Resource的Name(当然还有Bitmap),然后重载Equal,用Name判断。
@鲁广广: 或者你的Resouce如果你不发生改变 —— ;你构建一个自己的资源管理:放置一个Hashmap,有就直接取,没有就先去Resource Load近Hashmap,然后就只需要通过引用判断就行了。
@花飘水流兮: 最后采用了把预先把UpError图片放到内存中,然后直接提取picturebox的image的内存长度,长度一致就返回ture来判断了。
@鲁广广: 长度不好,容易和其他图片中标,尤其是做图标的往往多个图片长宽是一样的。按你的思路原本就应该是名字或者引用,既然都放内存了,相比你算是共享读取内存的方式,那么你可以直接引用判断了。
@花飘水流兮: 怎么说呢,其实我其他图片都是用高拍机拍的,像素都很高,我要对比的几个图片都是我自己定义的几个出错时的提示图片,所以中标的可能性微乎其微..,算了,先把软件功能实现了,回来再好好研究一下,最好的解决方案还是按照图片的唯一标识来判断是最好的。
最后,非常感谢,先结帖了
@鲁广广:
注意命名空间,直接函数拿去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
@花飘水流兮:
弱弱的问下 resourceCulture 这个是哪个变量?
@鲁广广: 为多语言准备的。你可以忽略。
判断图片的路径呢,你可以试试