Обнаружение, если два изображения PNG отличаются - PullRequest
3 голосов
/ 01 июня 2010

(Контекст: запуск сценариев autohotkey для автоматизации некоторых тестов. Планируется сделать снимки экрана, а затем сравнить их со «стандартными» снимками экрана, чтобы определить, изменился ли вывод).

Есть ли «умный» способ проверить, отличаются ли два изображения png?

Под умным я имею в виду, кроме как сравнивать их побайтово? (после сравнения их размера, очевидно)

Ответы [ 3 ]

3 голосов
/ 01 июня 2010

Предполагается, что ваши файлы PNG генерируются одним и тем же программным обеспечением (разные программы записи PNG могут создавать разные файлы для одних и тех же исходных изображений, поскольку существуют некоторые дополнительные параметры) и что они не записывают необязательные информационные фрагменты , связанные со временем (я полагаю, что немногие создатели PNG делают это), вы можете проверять их побайтно на уровне файлов. Стандартным способом является вычисление их хэшей (MD5 или SHA1).

1 голос
/ 03 июня 2010

Моя текущая реализация работает для меня, но немного медленно (особенно если они одинаковы):

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
0 голосов
/ 01 июня 2010

Вы можете хешировать стандартные скриншоты, а затем сравнить этот хеш с новым хешем скриншотов.

...