2010-06-01 42 views
3

(上下文:运行autohotkey脚本以尝试自动执行一些测试。计划是截取屏幕截图,然后将它们与“标准”屏幕截图进行比较以检测输出是否已更改)。检测两个PNG图像是否不同

是否有一种'聪明'的方法来检查两个PNG图像是不同的?

通过聪明我的意思是比较它们逐字节比较? (明显地比较它们的大小后)

回答

0

您可以散列标准截图,然后将该散列与新的截图散列进行比较。

3

假设您的PNG文件是由相同的软件生成的(不同的PNG作家可以为相同的原始图像创建不同的文件,因为有一些可选的设置),并且他们不写time related optional informational chunks(很少有PNG创作者这样做,我相信)你可以在文件级逐字节地检查它们。标准的方法是计算散列(MD5或SHA1)。

+0

嗯,貌似Bitmap.Save为PNG *不*捣鼓东西(如果我在连续做两个屏幕截图,二进制是不同的:(认为我可能必须去的Bitmap.GetPixel ... – Benjol 2010-06-02 10:23:30

+0

也许这是节省时间的创造?你可以检查它打开它在二进制/十六进制查看器和搜索“时间”(不区分大小写) 您也可以尝试以其他格式保存,可能是BMP - 更简单。 – leonbloy 2010-06-02 12:01:46

1

我目前的执行情况,对我的作品,但有点慢(特别是如果他们相同):

open System.Drawing 

let aresame fp1 fp2 = 
    let bitmap (f:string) = new Bitmap(f) 

    let same (bm1:Bitmap) (bm2:Bitmap) = 
     if bm1.Size <> bm2.Size then 
      false 
     else 
      seq { for x = 0 to bm1.Width - 1 do 
        for y = 0 to bm1.Height - 1 do 
         yield bm1.GetPixel(x, y) = bm2.GetPixel(x, y) } 
      |> Seq.forall id 

    use bm1 = bitmap fp1 
    use bm2 = bitmap fp2 
    same bm1 bm2 
相关问题