【问题标题】:Check if a Bitmap has been modified检查位图是否已被修改
【发布时间】:2013-11-26 06:29:15
【问题描述】:

我有一个包含位图的类,我想知道位图是否已更改(通过 SetPixel 或 GDI+)。

我不需要确切知道它何时发生,我只需要一种方法来判断它自上次检查以来是否发生过。

现在,我假设 Bitmap 类中尚未包含类似的内容,那么解决此问题的最佳方法是什么?

我可以为 GetPixel 和 SetPixel 提供我自己的包装函数,但是我不知道是否使用 GDI 更改了位图。我也可以为它做一个包装器,但这看起来真的是一个巨大的矫枉过正。

另一种可能的选择是保存一份副本,然后逐个像素地检查。这显然可以工作并且编写起来很简单,但是对于我的需要来说太慢了。

【问题讨论】:

    标签: c# bitmap


    【解决方案1】:

    您应该使用哈希或校验和。有一些简单的方法可以做到这一点,但我认为最简单的方法是在你的类中有一个string hash 属性,然后在你存储它的位图/二进制字符串/任何容器上调用GetHashCode()。将它设置为classes 属性,根据该值检查当前哈希码以查看是否有任何更改。您还可以编写自己的小校验和函数或从(我敢肯定)大量第三方选项中进行选择。

    【讨论】:

    • 这看起来不错,但不是通过遍历所有像素来计算哈希值吗?它比遍历它们并一一检查更快吗?
    • @LukaHorvat 它可能不会更快。当然,调用该方法比编写您自己的方法更简单,我想该方法已高度优化。判断文件是否已更改的唯一真正方法是查看二进制文件,哈希/校验和只是一种更快更简单的方法。
    • 这是另一个校验和/散列选项; stackoverflow.com/questions/10520048/… 还值得指出的是,这些方法不需要您保存文件的多个副本,因此它肯定有一些小的优势。无论哪种情况,您的表现都不会比这更好。哈希/校验和是代表文件的唯一值。你不能避免一点一点的比较。
    • 我猜想获得更快替代方案的唯一方法是位图在更改发生时跟踪更改。不过,我很确定 GDI 会直接更改它的二进制数据,因此没有真正的方法可以知道您是否不逐像素检查。好吧。谢谢。
    • @LukaHorvat 如果您说的是文件在磁盘上的实际更改,那么您只需检查上次写入时间。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2011-12-10
    • 2013-02-08
    相关资源
    最近更新 更多