我有一个类似于PICTIOBox控件的图像显示控件,它需要一个位图并显示它。问题是,我的控件将天真地尝试执行要求它访问其图像字段的操作,即使提供的位图已被释放。所以假设我有一个窗体,上面有我的图像显示控件。我已经将Image属性设置为从文件加载的图像,然后出于某种原因(无论为什么或如何)释放该图像。然后我做了一些事情来重新绘制图像控件,当它试图访问位图(现在已处理)时,它会左右抛出InvalidArgumentException。我理解这个问题,但对解决方案没有100%的信心。
我的图像显示控件无法控制图像引用是否被调用代码释放,并且我知道没有公共方法来检查对象是否被释放。我可以想到两种可能的解决方案:
在我实施选项1(我认为最有意义的选项)之前,我认为我会在这里询问,以防出现处理这种情况的最佳实践。
当我在C和Winforms中开发ImageViewer控件时,我遇到了同样的难题。事实上,处理图像的责任由控制的客户承担,而另一方面,不及时处理的错误将导致控制崩溃,这是不可接受的。
我使用了第一种方法——保存位图的本地/内部副本——除了内存使用,它没有任何缺点。我相信这是更好的方法。
如果要更改位图上的任何像素,则应始终克隆该像素并更改克隆的版本。
除此之外,你的解决方案可能是相当好的。