Tìm ảnh trùng nhau bằng VBA

Liên hệ QC

MỹHạnhCB

Đi mây, về gió. !!!
Tham gia
25/3/22
Bài viết
123
Được thích
18
Chào các anh chị trong diễn đàn GPE.
Em muốn hỏi là trong VBA có thuật toán chạy kiểm tra hình ảnh giống nhau không ạ? Nếu có, có thể có em xin để tham khảo ạ. Em xin cảm ơn nhiều.
"Theo như yêu cầu là chạy thư mục chứa ảnh (1) -> So sánh ảnh trong thư mục (1) -> Phát hiện từ ảnh 2,3,4 bị trùng (giống nhau) -> Báo cáo kết quả ra Excel"
 

File đính kèm

  • 1.zip
    5.4 MB · Đọc: 34
Chào các anh chị trong diễn đàn GPE.
Em muốn hỏi là trong VBA có thuật toán chạy kiểm tra hình ảnh giống nhau không ạ? Nếu có, có thể có em xin để tham khảo ạ. Em xin cảm ơn nhiều.
"Theo như yêu cầu là chạy thư mục chứa ảnh (1) -> So sánh ảnh trong thư mục (1) -> Phát hiện từ ảnh 2,3,4 bị trùng (giống nhau) -> Báo cáo kết quả ra Excel"
Này bạn có thể dùng tool ACD See vô Tools --> Find Duplicates
 
Upvote 0
Bài này đúng là thực sự khó với những người chỉ biết lập trình bằng copy code. Khi bắt tay vào thực hiện ý tưởng tôi mới thấy vất vả hơn dự tính --=0 Vì chả biết liệt kê các file như thế nào nên tôi giả sử có dữ liệu đầu vô là danh sách files, danh sách độ dài tương ứng và sai số của file size, thư mục chứa file. Và dưới đây là code hoạt động của tôi
PHP:
Sub RI_MU(files, lengths, tol As Integer, folder As String)
    Dim dict As Scripting.Dictionary
    Set dict = New Scripting.Dictionary
    Dim i, count
    count = UBound(lengths)
  
    For i = 0 To count
        Dim fl
        fl = (lengths(i) \ (tol + 1)) * (tol + 1)
        If dict.Exists(fl) Then
            dict(fl) = files(i) & ">" & dict(fl)
        Else
            dict.Add fl, files(i)
        End If
    Next

    Dim dup, k, c
    For Each k In dict
        dup = Split(dict(k), ">")
        c = UBound(dup)
        While (c > 0)
            Debug.Print "REMOVE " & folder & "\" & dup(c), dict(k)
            'DELETE dup(c) // KHUC NAY TU SU.
            c = c - 1
        Wend
    Next

End Sub
Sub run()
    Dim FS, LS
    FS = Array("1.JPG", "2.JPG", "3.JPG", "4.JPG", "5.JPG", "6.JPG", "7.JPG", "8.JPG", "9.JPG")
    LS = Array(903839, 860822, 860822, 860822, 833218, 844943, 856847, 860822, 844943)
    RI_MU FS, LS, 0, "D:\imgages"
End Sub
LƯU Ý: Copy thư mục ảnh riêng ra để mà thử nghiệm trên đó nếu không sau này bị xóa mất hình không trách tôi xúi bậy. --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh chị trong diễn đàn GPE.
Em muốn hỏi là trong VBA có thuật toán chạy kiểm tra hình ảnh giống nhau không ạ? Nếu có, có thể có em xin để tham khảo ạ. Em xin cảm ơn nhiều.
"Theo như yêu cầu là chạy thư mục chứa ảnh (1) -> So sánh ảnh trong thư mục (1) -> Phát hiện từ ảnh 2,3,4 bị trùng (giống nhau) -> Báo cáo kết quả ra Excel"
Có thể thêm và dùng này nhé!!!
Mã:
Public Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Option Compare Text 'dùng để không phân biệt hoa thường
Public Function FileDiskLen(szFilename As String) As Long
    Dim lSecPerClu As Long
    Dim lBytPerSec As Long
    Dim lFileSize As Long
    Dim lClusterSize As Long
    Dim sClusters As Single
    Dim lDummy As Long
    If Len(szFilename) < 4 Then Exit Function
    lDummy = GetDiskFreeSpace(Left$(szFilename, 3), lSecPerClu, lBytPerSec, lDummy, lDummy)
    lClusterSize = lSecPerClu * lBytPerSec
    If lClusterSize = 0 Then Exit Function
    lFileSize = FileLen(szFilename)
    sClusters = lFileSize / lClusterSize
    If Fix(sClusters) <> sClusters Then
        sClusters = Fix(sClusters + 1)
    End If
    FileDiskLen = sClusters * lClusterSize
End Function
Thay đoạn
Sheets("Sheet1").Cells(J, "B") = Filelen(fi.Path) ' lấy Size
Sheets("Sheet1").Cells(J, "B") = FileDiskLen(fi.Path) 'lấy Size on disk
 
Upvote 0
Vấn đề của em chủ yếu là tìm những ảnh bị lỗi và trùng lập nhau do bị nhân đôi hoặc bị đứng khung hình. Nên hôm qua giờ e kiểm tra kích cỡ (size) và (size on disk) thử thì những ảnh bình thường (1) khác nhau cả về (size) và (size on disk), và những ảnh bị trùng (đứng hoặc treo) (2) chỉ khác nhau ở (size) còn (size on disk) thì giống nhau hoàn toàn ạ.
Mong các anh chị giúp em đoạn mã để lấy được thông tin của (size on disk) ạ
Bài này thì phải nghĩ tới hash MD5 chứ nhỉ :|
 
Upvote 0
Có thể thêm và dùng này nhé!!!
Mã:
Public Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Option Compare Text 'dùng để không phân biệt hoa thường
Public Function FileDiskLen(szFilename As String) As Long
    Dim lSecPerClu As Long
    Dim lBytPerSec As Long
    Dim lFileSize As Long
    Dim lClusterSize As Long
    Dim sClusters As Single
    Dim lDummy As Long
    If Len(szFilename) < 4 Then Exit Function
    lDummy = GetDiskFreeSpace(Left$(szFilename, 3), lSecPerClu, lBytPerSec, lDummy, lDummy)
    lClusterSize = lSecPerClu * lBytPerSec
    If lClusterSize = 0 Then Exit Function
    lFileSize = FileLen(szFilename)
    sClusters = lFileSize / lClusterSize
    If Fix(sClusters) <> sClusters Then
        sClusters = Fix(sClusters + 1)
    End If
    FileDiskLen = sClusters * lClusterSize
End Function
Thay đoạn
Sheets("Sheet1").Cells(J, "B") = Filelen(fi.Path) ' lấy Size
Sheets("Sheet1").Cells(J, "B") = FileDiskLen(fi.Path) 'lấy Size on disk
Chạy ok rồi anh, cám ơn anh nhiều. }}}}}
 
Upvote 0
Có thể thêm và dùng này nhé!!!
Mã:
Public Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Option Compare Text 'dùng để không phân biệt hoa thường
Public Function FileDiskLen(szFilename As String) As Long
    Dim lSecPerClu As Long
    Dim lBytPerSec As Long
    Dim lFileSize As Long
    Dim lClusterSize As Long
    Dim sClusters As Single
    Dim lDummy As Long
    If Len(szFilename) < 4 Then Exit Function
    lDummy = GetDiskFreeSpace(Left$(szFilename, 3), lSecPerClu, lBytPerSec, lDummy, lDummy)
    lClusterSize = lSecPerClu * lBytPerSec
    If lClusterSize = 0 Then Exit Function
    lFileSize = FileLen(szFilename)
    sClusters = lFileSize / lClusterSize
    If Fix(sClusters) <> sClusters Then
        sClusters = Fix(sClusters + 1)
    End If
    FileDiskLen = sClusters * lClusterSize
End Function
Thay đoạn
Sheets("Sheet1").Cells(J, "B") = Filelen(fi.Path) ' lấy Size
Sheets("Sheet1").Cells(J, "B") = FileDiskLen(fi.Path) 'lấy Size on disk
Hầu hết cho ra đúng kích thước như tại Properties của Explorer, nhưng không biết vì sao lại không đúng kết quả với file này:
1649123915175.png
Kết quả chạy hàm:
1649124010635.png
 
Upvote 0
Bài này thì phải nghĩ tới hash MD5 chứ nhỉ :|
tặng bạn cái băm MD5 ; SHA nè...
Mã:
Function IsDuplicateFile(ByVal strFullNameFile_1 As String, ByVal strFullNameFile_2 As String, _
                         Optional blCheckBy_MD5andHA1 As Boolean = False) As Boolean
Dim strFileKind_1 As String, strSize_1 As String, strExtension_1 As String, strDateModified_1 As String
Dim strFileKind_2 As String, strSize_2 As String, strExtension_2 As String, strDateModified_2 As String
Dim strMD5_1 As String, strHA1_1 As String, strMD5_2 As String, strHA1_2 As String
Dim blCheck As Boolean

    strFileKind_1 = GetInfoFile(strFullNameFile_1, 11): strFileKind_2 = GetInfoFile(strFullNameFile_2, 11)
    strDateModified_1 = GetInfoFile(strFullNameFile_1, 3): strDateModified_2 = GetInfoFile(strFullNameFile_2, 3)
    With CreateObject("Scripting.FileSystemObject")
        strSize_1 = .GetFile(strFullNameFile_1).Size: strSize_2 = .GetFile(strFullNameFile_2).Size
        strExtension_1 = .GetExtensionName(strFullNameFile_1): strExtension_2 = .GetExtensionName(strFullNameFile_2)
    End With
    strMD5_1 = FileToMD5Hex(strFullNameFile_1): strMD5_2 = FileToMD5Hex(strFullNameFile_2)
    strHA1_1 = FileToSHA1Hex(strFullNameFile_1): strHA1_2 = FileToSHA1Hex(strFullNameFile_2)
   
    blCheck = strFileKind_1 = strFileKind_2 And strExtension_1 = strExtension_2 And strSize_1 = strSize_2
    If blCheckBy_MD5andHA1 Then
         blCheck = blCheck And strMD5_1 = strMD5_2 And strHA1_1 = strHA1_1
    Else
        blCheck = blCheck And strDateModified_1 = strDateModified_2
    End If
   
    If blCheck Then IsDuplicateFile = True Else IsDuplicateFile = False
End Function

Function GetInfoFile(ByVal strFullNameFile As String, ByVal iIndex As Integer) As String
Dim fldName As String, fleName As String, strResult As String, vSpecialChar
  'On Error Resume Next
    With CreateObject("Scripting.FileSystemObject")
        fldName = .GetFile(strFullNameFile).ParentFolder.path
        fleName = .GetFile(strFullNameFile).Name
    End With
    With CreateObject("Shell.Application")
        With .Namespace("" & fldName & "")
            strResult = .Getdetailsof(.ParseName("" & fleName & ""), iIndex)
            For Each vSpecialChar In Array(ChrW(8206), ChrW(8207), ChrW(8234), ChrW(8236))
                strResult = Replace(strResult, vSpecialChar, "")
            Next vSpecialChar
        End With
    End With
  On Error GoTo 0
  GetInfoFile = strResult
End Function

Function FileToMD5Hex(sFileName As String) As String
    Dim enc
    Dim bytes
    Dim outstr As String
    Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToMD5Hex = outstr
    Set enc = Nothing
End Function

Function FileToSHA1Hex(sFileName As String) As String
Dim enc
Dim bytes
Dim outstr As String
Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToSHA1Hex = outstr 'Returns a 40 byte/character hex string
    Set enc = Nothing
End Function

Function GetFileBytes(ByVal path As String) As Byte()
Dim lngFileNum As Long
Dim bytRtnVal() As Byte
    lngFileNum = FreeFile
    If LenB(Dir(path)) Then ''// Does file exist?
        Open path For Binary Access Read As lngFileNum
        ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
        Get lngFileNum, , bytRtnVal
        Close lngFileNum
    Else
        Err.Raise 53
    End If
    GetFileBytes = bytRtnVal
    Erase bytRtnVal
End Function

Lượm trên toàn thế giới ... cũng đã lâu òi....
 
Lần chỉnh sửa cuối:
Upvote 0
tặng bạn cái băm MD5 ; SHA nè...
Mã:
Function IsDuplicateFile(ByVal strFullNameFile_1 As String, ByVal strFullNameFile_2 As String, _
                         Optional blCheckBy_MD5andHA1 As Boolean = False) As Boolean
Dim strFileKind_1 As String, strSize_1 As String, strExtension_1 As String, strDateModified_1 As String
Dim strFileKind_2 As String, strSize_2 As String, strExtension_2 As String, strDateModified_2 As String
Dim strMD5_1 As String, strHA1_1 As String, strMD5_2 As String, strHA1_2 As String
Dim blCheck As Boolean

    strFileKind_1 = GetInfoFile(strFullNameFile_1, 11): strFileKind_2 = GetInfoFile(strFullNameFile_2, 11)
    strDateModified_1 = GetInfoFile(strFullNameFile_1, 3): strDateModified_2 = GetInfoFile(strFullNameFile_2, 3)
    With CreateObject("Scripting.FileSystemObject")
        strSize_1 = .GetFile(strFullNameFile_1).Size: strSize_2 = .GetFile(strFullNameFile_2).Size
        strExtension_1 = .GetExtensionName(strFullNameFile_1): strExtension_2 = .GetExtensionName(strFullNameFile_2)
    End With
    strMD5_1 = FileToMD5Hex(strFullNameFile_1): strMD5_2 = FileToMD5Hex(strFullNameFile_2)
    strHA1_1 = FileToSHA1Hex(strFullNameFile_1): strHA1_2 = FileToSHA1Hex(strFullNameFile_2)
   
    blCheck = strFileKind_1 = strFileKind_2 And strExtension_1 = strExtension_2 And strSize_1 = strSize_2
    If blCheckBy_MD5andHA1 Then
         blCheck = blCheck And strMD5_1 = strMD5_2 And strHA1_1 = strHA1_1
    Else
        blCheck = blCheck And strDateModified_1 = strDateModified_2
    End If
   
    If blCheck Then IsDuplicateFile = True Else IsDuplicateFile = False
End Function

Function GetInfoFile(ByVal strFullNameFile As String, ByVal iIndex As Integer) As String
Dim fldName As String, fleName As String, strResult As String, vSpecialChar
  'On Error Resume Next
    With CreateObject("Scripting.FileSystemObject")
        fldName = .GetFile(strFullNameFile).ParentFolder.path
        fleName = .GetFile(strFullNameFile).Name
    End With
    With CreateObject("Shell.Application")
        With .Namespace("" & fldName & "")
            strResult = .Getdetailsof(.ParseName("" & fleName & ""), iIndex)
            For Each vSpecialChar In Array(ChrW(8206), ChrW(8207), ChrW(8234), ChrW(8236))
                strResult = Replace(strResult, vSpecialChar, "")
            Next vSpecialChar
        End With
    End With
  On Error GoTo 0
  GetInfoFile = strResult
End Function

Function FileToMD5Hex(sFileName As String) As String
    Dim enc
    Dim bytes
    Dim outstr As String
    Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToMD5Hex = outstr
    Set enc = Nothing
End Function

Function FileToSHA1Hex(sFileName As String) As String
Dim enc
Dim bytes
Dim outstr As String
Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToSHA1Hex = outstr 'Returns a 40 byte/character hex string
    Set enc = Nothing
End Function

Lượm trên toàn thế giới ... cũng đã lâu òi....
Trong các Function FileToSHA1Hex và FileToMD5Hex có gọi hàm GetFileBytes nhưng không có code bạn ơi.
 
Upvote 0
Việc dùng kích cỡ file để xác định 2 file có trùng hay không đồng nghĩa với việc áp dụng xác suất trong phương cách của tôi. Nếu chênh lệch giữa 2 file càng nhỏ thì phương pháp có độ chính xác càng cao và ngược lại. Với "size on disk" thì đô chênh lệch có thể lên tới 4096 byte (4kB) trên máy tính của tôi và khả năng so sánh sai sẽ tăng lên đáng kể.

Nếu kích cỡ mỗi file của bạn tính bằng chục MB trở lên thì có sai số có thể chấp nhận được nhưng nếu kích cỡ file của bạn chỉ tính bằng KB thì so sánh theo "size on disk" sẽ rất nguy hiểm. Chẳng hạn file có kích cỡ 81.920 bytes sẽ cùng cỡ file 77.825 bytes nếu cùng tính trên "size on disk" trên máy của tôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong các Function FileToSHA1Hex và FileToMD5Hex có gọi hàm GetFileBytes nhưng không có code bạn ơi.
Ahhh... xin lỗi anh ngàn lần xin lỗi anh...
Mã:
Function GetFileBytes(ByVal path As String) As Byte()
Dim lngFileNum As Long
Dim bytRtnVal() As Byte
    lngFileNum = FreeFile
    If LenB(Dir(path)) Then ''// Does file exist?
        Open path For Binary Access Read As lngFileNum
        ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
        Get lngFileNum, , bytRtnVal
        Close lngFileNum
    Else
        Err.Raise 53
    End If
    GetFileBytes = bytRtnVal
    Erase bytRtnVal
End Function
Bài đã được tự động gộp:

Việc dùng kích cỡ file để xác định 2 file có trùng hay không đồng nghĩa với việc áp dụng xác suất trong phương cách của tôi. Nếu chênh lệch giữa 2 file càng nhỏ thì phương pháp có độ chính xác càng cao và ngược lại. Với "size on disk" thì đô chênh lệch có thể lên tới 4096 byte (4kB) trên máy tính của tôi và khả năng so sánh sai sẽ tăng lên đáng kể.

Nếu kích cỡ mỗi file của bạn tính bằng chục MB trở lên thì có sai số có thể chấp nhận được nhưng nếu kích cỡ file của bạn chỉ tính bằng KB thì so sánh theo "size on disk" sẽ rất nguy hiểm.
vậy theo bài #47... so sánh từ a ->á và A - >Á ... không biết đủ hết chưa ta...?
 
Upvote 0
Ahhh... xin lỗi anh ngàn lần xin lỗi anh...
Mã:
Function GetFileBytes(ByVal path As String) As Byte()
Dim lngFileNum As Long
Dim bytRtnVal() As Byte
    lngFileNum = FreeFile
    If LenB(Dir(path)) Then ''// Does file exist?
        Open path For Binary Access Read As lngFileNum
        ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
        Get lngFileNum, , bytRtnVal
        Close lngFileNum
    Else
        Err.Raise 53
    End If
    GetFileBytes = bytRtnVal
    Erase bytRtnVal
End Function
Bài đã được tự động gộp:


vậy theo bài #47... so sánh từ a ->á và A - >Á ... không biết đủ hết chưa ta...?
Chạy ngon rồi bạn. Dùng thứ này so sánh là chắc ăn 100%, khỏi phải rắc rối cài đặt Python
 
Upvote 0
vậy theo bài #47... so sánh từ a ->á và A - >Á ... không biết đủ hết chưa ta...?
Thú thực trình độ của tôi hơi bị dốt nên tôi thường ít khi đọc kỹ code của người khác vì đọc xong thì chóng mặt mà cũng chả hiểu gì --=0 Tôi xin được hỏi tác giả là nếu áp dụng phương pháp của bạn thì so sánh cỡ 1000 file kích thước trên 1MB sẽ mất tối thiểu bao lâu nhỉ?
 
Upvote 0
Chạy ngon rồi bạn. Dùng thứ này so sánh là chắc ăn 100%, khỏi phải rắc rối cài đặt Python
Cái nào nó cũng có cái hay và cái thế mạnh của nó thôi mừ... nên thôi mình thích gì mần đó zậy!
Thú thực trình độ của tôi hơi bị dốt nên tôi thường ít khi đọc code của người khác vì đọc xong thì chóng mặt mà cũng chả hiểu gì --=0 Tôi xin được hỏi tác giả là nếu áp dụng phương pháp của bạn thì so sánh cỡ 1000 file kích thước trên 1MB sẽ mất tối thiểu bao lâu nhỉ?
hic... bạn mần thử rồi biết... tớ chưa dám thử... vì sao tôi cũng không biết vì sao ....
 
Upvote 0
Thú thực trình độ của tôi hơi bị dốt nên tôi thường ít khi đọc kỹ code của người khác vì đọc xong thì chóng mặt mà cũng chả hiểu gì --=0 Tôi xin được hỏi tác giả là nếu áp dụng phương pháp của bạn thì so sánh cỡ 1000 file kích thước trên 1MB sẽ mất tối thiểu bao lâu nhỉ?
Tôi thường chạy thử để hiểu đại khái code làm gì thôi chứ đọc suông thì nhức đầu lắm.
 
Upvote 0
hic... bạn mần thử rồi biết... tớ chưa dám thử... vì sao tôi cũng không biết vì sao ....
Tôi dốt đến mức làm sao cho code của bạn chạy cũng đủ đau đầu rồi --=0 . Nếu có đáp áp sẵn thì báo luôn nhé.
Tôi thường chạy thử để hiểu đại khái code làm gì thôi chứ đọc suông thì nhức đầu lắm.
Nếu anh đã chạy thử thì chia sẻ kết quả cho tôi biết nhé chứ nhìn vô code tôi đoán là cái máy của tôi nếu chạy theo cách đó trên 1000 file có dung lượng tính bằng MB thì bảo đảm là TREO cứng.
 
Upvote 0
Tôi dốt đến mức làm sao cho code của bạn chạy cũng đủ đau đầu rồi --=0 . Nếu có đáp áp sẵn thì báo luôn nhé.

Nếu anh đã chạy thử thì chia sẻ kết quả cho tôi biết nhé chứ nhìn vô code tôi đoán là cái máy của tôi nếu chạy theo cách đó trên 1000 file có dung lượng tính bằng MB thì bảo đảm là TREO cứng.
À, tôi thử 2 hàm băm để sau này dùng vào việc cần thiết thôi chứ không thử cho trường hợp của thớt này
 
Upvote 0
Đối với việc tìm ảnh trùng nhau, chủ thớt phải làm rõ thêm các dữ kiện liên quan đến định nghĩa "trùng nhau", chứ mỗi người một ý thì code nó cũng khác nhau.
1. Ảnh trùng nhau là ảnh lấy từ một nguồn xuống tức là không lấy lúc thì thông qua Zalo, lúc thì qua Messenger.... Ảnh không qua chỉnh sửa (không làm thay đổi các đối tượng trong ảnh): nâng sáng, độ tương phản, độ màu,... Nói chung là so sánh ảnh gốc với nhau thì tôi nghĩ so sánh theo Size là hợp lý (chủ quan chứ kiểm).
2. Ảnh trùng nhau là cùng 1 ảnh nhưng đã rezise kích thước, đã qua nâng sáng, độ tương phản nhưng thực chất hình ảnh là giống nhau hoàn toàn. Trường hợp này thì dùng 1 trong các thuật toán như tôi có gửi tham khảo ở trên như: crop ảnh, đổi màu qua xám, rồi hash, băm gì đó để so sánh.
 
Upvote 0
Chạy ngon rồi bạn. Dùng thứ này so sánh là chắc ăn 100%, khỏi phải rắc rối cài đặt Python
Anh có thể cho em tham khảo được không ạ, Em áp vào nhưng bị báo lỗi ạ :p
Bài đã được tự động gộp:

Thú thực trình độ của tôi hơi bị dốt nên tôi thường ít khi đọc kỹ code của người khác vì đọc xong thì chóng mặt mà cũng chả hiểu gì --=0 Tôi xin được hỏi tác giả là nếu áp dụng phương pháp của bạn thì so sánh cỡ 1000 file kích thước trên 1MB sẽ mất tối thiểu bao lâu nhỉ?
Anh đợi e chút e chạy thử trên 1 nguồn dữ liệu thật (>10.000 ảnh) với dung lượng (>2mb) 1 ảnh rồi e báo lại kết quả ạ :D
 

File đính kèm

  • z3317246234811_4777a206adc5e18b198f23de6813a8f1.jpg
    z3317246234811_4777a206adc5e18b198f23de6813a8f1.jpg
    54.1 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Web KT
Back
Top Bottom