【问题标题】:AutoIt - Find duplicate images by content?AutoIt - 按内容查找重复图像?
【发布时间】:2017-01-26 02:20:08
【问题描述】:

我正在寻找一种使用 AutoIt 查找重复图像的方法。我研究了 PixelSearch 和 SearchImage,但都没有完全按照我的要求去做。

我正在尝试按文件名比较 2 个图像,看看它们是否是相同的图像(重复)。我认为最好的方法是:

1) 以像素为单位获取两种图像大小 2)使用while循环获取每个像素的颜色并将其存储在数组中 3) 检查两个数组是否相等。

有人对如何实现这一目标有任何想法吗?

【问题讨论】:

    标签: image duplicates compare pixel autoit


    【解决方案1】:

    我刚刚对此主题进行了更多研究,并根据我阅读的一些答案构建了一个小型 UDF。 (主要基于monoceres's answer on AutoItScript.com)。我想我会在这里发布我的解决方案来帮助任何未来的开发人员!


    CompareImagesUDF.au3

    Func _CompareImages($ciImageOne, $ciImageTwo)
    _GDIPlus_Startup()
    $fname1=$ciImageOne
    If $fname1="" Then Exit
    $fname2=$ciImageTwo
    If $fname2="" Then Exit
    $bm1 = _GDIPlus_ImageLoadFromFile($fname1)
    $bm2 = _GDIPlus_ImageLoadFromFile($fname2)
    
    ; MsgBox(0, "bm1==bm2", CompareBitmaps($bm1, $bm2))
    Return CompareBitmaps($bm1, $bm2)
    _GDIPlus_ImageDispose($bm1)
    _GDIPlus_ImageDispose($bm2)
    _GDIPlus_Shutdown()
    EndFunc
    
    Func CompareBitmaps($bm1, $bm2)
    
        $Bm1W = _GDIPlus_ImageGetWidth($bm1)
        $Bm1H = _GDIPlus_ImageGetHeight($bm1)
        $BitmapData1 = _GDIPlus_BitmapLockBits($bm1, 0, 0, $Bm1W, $Bm1H, $GDIP_ILMREAD, $GDIP_PXF32RGB)
        $Stride = DllStructGetData($BitmapData1, "Stride")
        $Scan0 = DllStructGetData($BitmapData1, "Scan0")
    
        $ptr1 = $Scan0
        $size1 = ($Bm1H - 1) * $Stride + ($Bm1W - 1) * 4
    
    
        $Bm2W = _GDIPlus_ImageGetWidth($bm2)
        $Bm2H = _GDIPlus_ImageGetHeight($bm2)
        $BitmapData2 = _GDIPlus_BitmapLockBits($bm2, 0, 0, $Bm2W, $Bm2H, $GDIP_ILMREAD, $GDIP_PXF32RGB)
        $Stride = DllStructGetData($BitmapData2, "Stride")
        $Scan0 = DllStructGetData($BitmapData2, "Scan0")
    
        $ptr2 = $Scan0
        $size2 = ($Bm2H - 1) * $Stride + ($Bm2W - 1) * 4
    
        $smallest = $size1
        If $size2 < $smallest Then $smallest = $size2
        $call = DllCall("msvcrt.dll", "int:cdecl", "memcmp", "ptr", $ptr1, "ptr", $ptr2, "int", $smallest)
    
    
    
        _GDIPlus_BitmapUnlockBits($bm1, $BitmapData1)
        _GDIPlus_BitmapUnlockBits($bm2, $BitmapData2)
    
        Return ($call[0]=0)
    
    
    EndFunc  ;==>CompareBitmaps
    

    现在要比较图像,您所要做的就是包含 CompareImagesUDF.au3 文件并调用该函数。


    CompareImagesExample.au3

    #Include "CompareImagesUDF.au3"
    
    ; Define the two images (They can be different file formats)
    $img1 = "Image1.jpg"
    $img2 = "Image2.jpg"
    
    ; Compare the two images
    $duplicateCheck = _CompareImages($img1, $img2)
    MsgBox(0,"Is Duplicate?", $duplicateCheck)
    

    【讨论】:

      【解决方案2】:

      如果您想确定两个图像是否完全匹配,无论名称是否相同,请使用内置 Crypt 函数 _Crypt_HashFile 和 MD2 或 MD5 对两个文件进行哈希并进行比较.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2016-10-11
        • 2012-08-25
        • 2013-07-07
        • 2011-06-27
        • 2021-05-15
        相关资源
        最近更新 更多