(上下文:运行autohotkey脚本以尝试自动执行一些测试。计划是截取屏幕截图,然后将它们与“标准”屏幕截图进行比较以检测输出是否已更改)。检测两个PNG图像是否不同
是否有一种'聪明'的方法来检查两个PNG图像是不同的?
通过聪明我的意思是比较它们逐字节比较? (明显地比较它们的大小后)
(上下文:运行autohotkey脚本以尝试自动执行一些测试。计划是截取屏幕截图,然后将它们与“标准”屏幕截图进行比较以检测输出是否已更改)。检测两个PNG图像是否不同
是否有一种'聪明'的方法来检查两个PNG图像是不同的?
通过聪明我的意思是比较它们逐字节比较? (明显地比较它们的大小后)
您可以散列标准截图,然后将该散列与新的截图散列进行比较。
假设您的PNG文件是由相同的软件生成的(不同的PNG作家可以为相同的原始图像创建不同的文件,因为有一些可选的设置),并且他们不写time related optional informational chunks(很少有PNG创作者这样做,我相信)你可以在文件级逐字节地检查它们。标准的方法是计算散列(MD5或SHA1)。
我目前的执行情况,对我的作品,但有点慢(特别是如果他们是相同):
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
嗯,貌似Bitmap.Save为PNG *不*捣鼓东西(如果我在连续做两个屏幕截图,二进制是不同的:(认为我可能必须去的Bitmap.GetPixel ... – Benjol 2010-06-02 10:23:30
也许这是节省时间的创造?你可以检查它打开它在二进制/十六进制查看器和搜索“时间”(不区分大小写) 您也可以尝试以其他格式保存,可能是BMP - 更简单。 – leonbloy 2010-06-02 12:01:46