AutoIt - 按内容查找重复图像?

时间:2016-04-06 23:39:37

标签: image duplicates compare pixel autoit

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

我试图通过文件名比较2个图像,看看它们是否是同一个图像(重复)。我认为最好的方法是:

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

有没有人对如何实现这一点有任何想法?

2 个答案:

答案 0 :(得分:1)

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

CompareImagesUDF.au3

import requests, pprint
from bs4 import BeautifulSoup as BS

url = "https://forums.spacebattles.com/threads/the-wizard-of-woah-and-the-impossible-methods-of-necromancy.337233/"
r = requests.get(url)
soup = BS(r.content, "html.parser")

#To find all posts from a specific user everything below this is for all posts
specific_messages = soup.findAll('li', {'data-author': 'author_name'})


#To find every post from every user
posts = {}

message_container = soup.find('ol', {'id':'messageList'}) 
messages = message_container.findAll('li', recursive=0)
for message in messages:
    author = message['data-author']
    #or don't encode to utf-8 simply for printing in shell
    content = message.find('div', {'class':'messageContent'}).text.strip().encode("utf-8")
    if author in posts:
        posts[author].append(content)
    else:
        posts[author] = [content]
pprint.pprint(posts)

现在比较想象力,你要做的就是包括CompareImagesUDF.au3文件并调用函数。

CompareImagesExample.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

答案 1 :(得分:0)

如果要查明两个图像是否完全匹配,无论名称是相同还是不同,请使用内置加密函数_Crypt_HashFile和MD2或MD5来对两个文件进行哈希处理比较一下。

相关问题