AutoIt - Find duplicate images by content?

后端 未结 2 1314
囚心锁ツ
囚心锁ツ 2021-01-28 05:08

I am looking for a way to find duplicate images using AutoIt. I\'ve looked into PixelSearch and SearchImage but neither do exactly what I need them to do.

I am trying to

相关标签:
2条回答
  • 2021-01-28 05:18

    If you want to find out if both images are an exact match, regardless if names are the same or different, use the built-in Crypt function _Crypt_HashFile with MD2 or MD5 to make a hash of both files and compare that.

    0 讨论(0)
  • 2021-01-28 05:27

    I just did some more research on this subject and built a small UDF based on a few answers I read. (Mainly based off of monoceres's answer on AutoItScript.com). I figured I would post my solution here to help any future developers!


    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
    

    Now to compare imagages, all you have to do is include the CompareImagesUDF.au3 file and call the function.


    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)
    
    0 讨论(0)
提交回复
热议问题