2013-11-25 146 views
0

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

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

现在,我假设类似的东西还没有包装在Bitmap类中,那么解决这个问题的最好方法是什么?

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

另一种可能的选择是保存副本,然后逐个像素地检查。这显然会起作用,而且写起来很微不足道,但对我的需求来说太慢了。

回答

1

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

+0

这看起来不错,但不是通过反复遍历所有像素计算的散列?它是如何快速迭代并逐一检查? –

+0

@LukaHorvat它可能不会更快。当然,调用这个方法比写你自己的方法更简单,我想这种方法是高度优化的。判断文件是否改变的唯一方法是查看二进制文件,哈希/校验和只是一个更简单的方法。 – evanmcdonnal

+0

这是另一个校验和/散列选项; http://stackoverflow.com/questions/10520048/calculate-md5-checksum-for-a-file也值得指出这些方法不要求你保存文件的多个副本,所以它肯定有一些次要的优势。在任何情况下,你的表现都不会比这更好。散列/校验和是表示文件的唯一值。你不能避免做一点点比较。 – evanmcdonnal