Tìm ảnh trùng nhau bằng VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

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"
Hihi. Ví dụ ảnh 1 như trong file. Tới ảnh 2 tự nhiên có cái lá rơi vào đúng khung hình, ảnh 3 thì có cơn gió thổi qua làm cái gì đó lệch đi khoảng 1cm. Thì được tính là giống nhau hay khác nhau
 
Upvote 0
Thế thì ở mỗi 1 bức ảnh đều là khác nhau nếu góc quay không phải là góc chết rồi. Giả sử có là góc chết đi chăng nữa. Ánh sáng nó cũng làm bức ảnh thay đổi mà
dạ, đúng rồi đó a. Mục đích của e là muốn tìm những ảnh bị nhân lên hoặc những ảnh bị đứng khung hình ạ. Còn mọi vấn đề khác thì đều là không giống nhau.
 
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"
Tuy không GPE lắm nhưng mà các app dọn rác trên điện thoại hình như là có chức năng phát hiện ảnh trùng lặp. Nếu GPE chưa có giải pháp thì bác thử nhé.
 
Upvote 0
Trường hợp của bạn thì giải quyết thủ công cũng khá đơn giản. Bạn cứ xếp thứ tự file theo kích cỡ (size) thì gần như 99,9% file trùng lặp (giống nhau đến từng bit) sẽ xếp liền với nhau. Còn lại khoảng 0,1% là những file cùng size nhưng nội dung khác nhau nhưng khả năng này thì vô cùng thấp. Như 7 file minh họa của bạn, sau khi sắp xếp tôi thấy file 2, 3, 4 là trùng nhau về kích cỡ và thật sự cũng trùng nhau về nội dung.

Dựa vào vài điểm của nguyên lý này thì việc lập trình thì cũng rất dễ với nhiều anh chị ở đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Trường hợp của bạn thì giải quyết thủ công cũng khá đơn giản. Bạn cứ xếp thứ tự file theo kích cỡ (size) thì gần như 99,9% file trùng lặp (giống nhau đến từng bit) sẽ xếp liền với nhau. Còn lại khoảng 0,1% là những file cùng size nhưng nội dung khác nhau nhưng khả năng này thì vô cùng thấp. Đưa nguyên lý này vào lập trình thì cũng rất dễ với nhiều anh chị ở đây.
Dạ vâng ạ, ý tưởng tuyệt vời, nhưng để đưa vào lập trình lấy và so sánh theo kích cỡ (size) ngoài excel thì vượt quá khả năng của e rồi ạ. Mong các anh chị giúp đỡ :p
 
Upvote 0
Cho em ngồi hóng với.Quan tâm tới cái này
Code python nè :D
Python:
import PythonMagick
import os

def imgSignature(imgPath):
    img = PythonMagick.Image(imgPath)
    return img.signature()

directory = r'C:\Users\plan14\Downloads\1' # Đổi Link folder chứa ảnh
j= []
imgExtension = ('.jpg','.png','.jpeg')
for filename in os.listdir(directory):
    fullpath = os.path.join(directory, filename)
    if filename.lower().endswith((imgExtension)):
        a = imgSignature(fullpath)
        # print(a)
        if a in j:
            os.rename(fullpath, os.path.join(directory,'DelFile_' + filename))
        else:
            j.append(imgSignature(fullpath))
Code này chỉ đổi tên file giống nhau (3 ảnh giống nhau thì đổi 2 ảnh sau) thành file có tiền tố "DelFile" chứ không xóa trực tiếp ảnh, để người dùng nếu muốn có thể vào xem lại. Cần xóa thì lọc DelFile xóa.
 
Upvote 0
Code python nè :D
Python:
import PythonMagick
import os

def imgSignature(imgPath):
    img = PythonMagick.Image(imgPath)
    return img.signature()

directory = r'C:\Users\plan14\Downloads\1' # Đổi Link folder chứa ảnh
j= []
imgExtension = ('.jpg','.png','.jpeg')
for filename in os.listdir(directory):
    fullpath = os.path.join(directory, filename)
    if filename.lower().endswith((imgExtension)):
        a = imgSignature(fullpath)
        # print(a)
        if a in j:
            os.rename(fullpath, os.path.join(directory,'DelFile_' + filename))
        else:
            j.append(imgSignature(fullpath))
Code này chỉ đổi tên file giống nhau (3 ảnh giống nhau thì đổi 2 ảnh sau) thành file có tiền tố "DelFile" chứ không xóa trực tiếp ảnh, để người dùng nếu muốn có thể vào xem lại. Cần xóa thì lọc DelFile xóa.
@Nhattanktnn học môn PY từ hồi nào vậy ta?
 
Upvote 0
Code này chỉ đổi tên file giống nhau (3 ảnh giống nhau thì đổi 2 ảnh sau) thành file có tiền tố "DelFile" chứ không xóa trực tiếp ảnh, để người dùng nếu muốn có thể vào xem lại. Cần xóa thì lọc DelFile xóa.
Mơ hồ lắm luôn ấy. Cho em hỏi chút. Nó xét ảnh giống nhau là xét về cái gì thế anh?
Có lẽ em vẫn chưa hình dung được là xét giống nhau là xét cái gì á.
Nhìn code như kiểu đi câu thấy cá tung tăng bơi dưới hồ ấy
 
Upvote 0
Mơ hồ lắm luôn ấy. Cho em hỏi chút. Nó xét ảnh giống nhau là xét về cái gì thế anh?
Có lẽ em vẫn chưa hình dung được là xét giống nhau là xét cái gì á.
Nhìn code như kiểu đi câu thấy cá tung tăng bơi dưới hồ ấy
Mình chỉ biết thư viện đó nó băm hình ảnh thành những chuỗi thế này (7 chuỗi là của 7 hình):

844d0998074d7900d37b1b732e01903135fedc83a4388df124a755e6de9925a5
a619a0ccc7ef279a2ba69f380236be4d04fea291e4a2990a6104306520210cd2
a619a0ccc7ef279a2ba69f380236be4d04fea291e4a2990a6104306520210cd2
a619a0ccc7ef279a2ba69f380236be4d04fea291e4a2990a6104306520210cd2
f4361d16663147cfd2ffd0bb77a7307e553611ab12df7ee0cace5cbeb33d8eb1
040e296dbb0ac8c67c5a7777c52598cc88d5b181096f2f241c1413cd4453b9cf
ed465959ba79653f9de695571e6f211ee26f9ca3b11f4fb36643cc283442bde2

Thì 3 chuỗi từ 2-4 là giống nhau, cho nên sẽ xóa ảnh thứ 3 và 4. Còn nguyên lý nó băm thế nào ra vậy thì mình không biết haha
 
Upvote 0
Còn nguyên lý nó băm thế nào ra vậy thì mình không biết haha
Khó nhỉ? Kể ra biết được nguyên lý nó xác nhận ảnh A với ảnh B giống nhau dựa vào cái gì thì mới chắc ăn.
Gửi chủ thớt:
Tự nhiên nhớ ra cái vụ trong điện thoại của bản thân. Có đứa con gái lấy điện thoại chụp chụp chụp: n kiểu ảnh. Sau khi vào Thư viện ảnh. Máy điện thoại đột nhiên báo dọn dẹp thư viện: Bạn có muốn xóa những ảnh trùng. Liệu cách này có áp dụng được cho chủ thớt không thì thử tham khảo tìm hiểu xem thế nào nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn giúp viết VBA excel in ấn theo thông tin và file mẫu bên dưới. (mình không biết đăng bài viết ở đâu vì được thông báo không đủ đặt quyền đăng bài)
..............
.............
Nhờ viết VBA Excel In tự động như sau:

+ Tại sheet BanGiao khi nhấn nút in sẽ in tất cả các biên bản theo điều kiện ở ô AC1: Ví dụ BGMB

(Biên bản BGMB được quét ở sheet Data từ cột B8 trở đi)
 

File đính kèm

Upvote 0
Khó nhỉ? Kể ra biết được nguyên lý nó xác nhận ảnh A với ảnh B giống nhau dựa vào cái gì thì mới chắc ăn.
Hiệu được câu lệnh của nó thì biết thôi bạn, nhưng không học như tôi thì thua rồi. Ví dụ trong đoạn mã trên tôi đoán liên quan đến nhận diện ảnh có 2 câu j[ ] và a = imgSignature(fullpath). Sau đó duyệt vòng lặp để kiểm tra a in j.
Múa rìu qua mắt thợ, kkkkk
 
Upvote 0
Hiệu được câu lệnh của nó thì biết thôi bạn
Không dễ đâu bác ơi, code này chỉ là phần nổi mình viết ra. Còn phần chìm phía sau là cả một thư viện xử lý hình ảnh của nó. Gọi thư viện đó ra xử lý thôi, còn cái phần thư viện bên trong nó làm gì sao biết được. Nếu muốn hiểu thì phải ngồi đọc tài liệu về thư viện đó, bla bla ... :D
@BuiQuangThuan : Hình như nó xử lý liên quan tới pixel ảnh với tông màu gì đó.. cái này chịu :D
 
Upvote 0
Không dễ đâu bác ơi, code này chỉ là phần nổi mình viết ra. Còn phần chìm phía sau là cả một thư viện xử lý hình ảnh của nó. Gọi thư viện đó ra xử lý thôi, còn cái phần thư viện bên trong nó làm gì sao biết được. Nếu muốn hiểu thì phải ngồi đọc tài liệu về thư viện đó, bla bla ... :D
@BuiQuangThuan : Hình như nó xử lý liên quan tới pixel ảnh với tông màu gì đó.. cái này chịu :D
Ý tôi là chỉ cần hiểu câu lệnh thôi là xử lý được rồi (đó là chuyện của lập trình viên mà), chứ thư viện của nó tìm hiểu mốc đời cũng không xong (mà tìm hiểu để làm gì cơ chứ)
 
Upvote 0
Hình như nó xử lý liên quan tới pixel ảnh với tông màu gì đó.. cái này chịu
Nếu như anh nói thế này thì độ tin cậy cao nè. Nếu như thế thì có thể có nhiều ý tưởng với cái này ấy nhỉ? Chẳng hạn đối chiếu ảnh cần duyệt với 1 cái ảnh gốc nào đó xem nó giống bao nhiêu % cũng được phải không anh?
Nhưng khổ nỗi độ ngu dốt của bản thân luôn lớn hơn độ thông minh.
Nhìn thì thèm mà không biết làm thế nào.hihi
 
Upvote 0
Trường hợp của bạn thì giải quyết thủ công cũng khá đơn giản. Bạn cứ xếp thứ tự file theo kích cỡ (size) thì gần như 99,9% file trùng lặp (giống nhau đến từng bit) sẽ xếp liền với nhau. Còn lại khoảng 0,1% là những file cùng size nhưng nội dung khác nhau nhưng khả năng này thì vô cùng thấp. Như 7 file minh họa của bạn, sau khi sắp xếp tôi thấy file 2, 3, 4 là trùng nhau về kích cỡ và thật sự cũng trùng nhau về nội dung.

Dựa vào vài điểm của nguyên lý này thì việc lập trình thì cũng rất dễ với nhiều anh chị ở đây.

Theo như ở anh #14 có chút ý tưởng. Thì em có gom ghép ra được 1 đoạn như này(file đính kèm). Nhưng e không hiểu ở chổ đoạn "Redim()" và trả kết quả cho nó như thế nào ( chỉ gán tên những ảnh có cùng kích cỡ (size) vào Excel).
Các anh chị xem giúp em ạ. Em cám ơn nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đừng có làm liều kiểu loại nhầm hơn bỏ sót như thế. Cái dung lượng tập tin không nói lên điều gì cả.

Người ta so sánh từng byte, từng pixel còn chưa ăn ai.
Vâng a, nhưng xét trên phương diện học tập thì anh có thể chỉ em khúc trả kết quả của những tên ảnh trùng từ (Redim()) ra được không ạ. :p
 
Upvote 0
Đừng có làm liều kiểu loại nhầm hơn bỏ sót như thế. Cái dung lượng tập tin không nói lên điều gì cả.

Người ta so sánh từng byte, từng pixel còn chưa ăn ai.
Bây giờ cho befaint cầm một cái camera thông số cố định là 10Mpx - nghĩa là tấm được chụp nào cũng sẽ có độ phân giải y như nhau. Theo befaint thì PHẢI chụp ÍT NHẤT bao nhiêu tấm ở định dạng JPG thì 99% khả năng sẽ xuất hiện 2 tấm CÙNG dung lượng file nhưng hình ảnh thì KHÁC nhau?
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ cho anh cầm một cái camera thông số cố định là 10Mpx - nghĩa là tấm được chụp nào cũng sẽ có độ phân giải y như nhau. Theo anh chị thì PHẢI chụp ít nhất bao nhiêu tấm ở định dạng JPG thì 100% khả năng sẽ xuất hiện 2 tấm CÙNG dung lượng file nhưng hình ảnh thì KHÁC nhau?
theo như "file đính kèm" của e ở trên, anh có thể giúp e chổ thay vì lấy kích cỡ (size) thì lấy kích cỡ (size on disk) được không a.
Theo như chiều giờ e chạy thử nghiệm với thì đến phần hình ảnh bị đứng tầm 2,3 hình đầu (của hình đã đứng(trùng lập)) thì cái kích cỡ (size) nó vẫn khác nhau á anh, chỉ có kích cỡ (size on disk) là giống nhau từ lúc bắt đầu có hình trùng lập. Cám ơn a
 

File đính kèm

  • 23a191aa82db4c8515ca.png
    23a191aa82db4c8515ca.png
    7.2 KB · Đọc: 8
Upvote 0
theo như "file đính kèm" của e ở trên, anh có thể giúp e chổ thay vì lấy kích cỡ (size) thì lấy kích cỡ (size on disk) được không a.
Ý bạn là 2 file trùng nhau nhưng "file size" lệch nhau vài byte à? Lần đầu tiên mới nghe tình huống này. Bạn xem lệch tối đa bao nhiêu rồi dùng phép chia lấy nguyên (\) để mà đối chiếu, chẳng hạn lệch 10 thì thực hiện phép so sánh size1\(10+1)=size2\(10+1). Còn so sánh theo "size on disk" thì sai số sẽ tăng lên một tý đấy. --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Ý bạn là 2 file trùng nhau nhưng "file size" lệch nhau vài byte à? Lần đầu tiên mới nghe tình huống này. Bạn xem lệch tối đa bao nhiêu rồi dùng phép chia lấy nguyên (\) để mà đối chiếu, chẳng hạn lệch 10 thì thực hiện phép so sánh (size1\10)=(size2\10). Còn so sánh theo "size on disk" thì sai số sẽ tăng lên một tý đấy nhưng vẫn ở ngưỡng chấp nhận được. --=0
Chiều giờ e có thử trên nhiều ảnh dữ liệu khác nhau. Thì e thấy “size on disk” có vẻ khớp so với vấn đề của e. Nhưng cái khó là em không biết lấy thông tin của “size on disk” của ảnh đó ra ntn ạ. Tại thư mục đính kèm (file 7 ảnh) chỉ là e sao chép ra để anh chị hình dung thôi ạ nên vấn đề giống nhau 100% là đúng. Nhưng trên dữ liệu gốc của e thì phần “size on disk” nó mới trùng nhau ( của các ảnh trùng )
Bài đã được tự động gộp:

Chiều giờ e có thử trên nhiều ảnh dữ liệu khác nhau. Thì e thấy “size on disk” có vẻ khớp so với vấn đề của e. Nhưng cái khó là em không biết lấy thông tin của “size on disk” của ảnh đó ra ntn ạ. Tại thư mục đính kèm (file 7 ảnh) chỉ là e sao chép ra để anh chị hình dung thôi ạ nên vấn đề giống nhau 100% là đúng. Nhưng trên dữ liệu gốc của e thì phần “size on disk” nó mới trùng nhau ( của các ảnh trùng )
Do dữ liệu gốc của e khá nặng nên e không thể nén và bỏ lên cho anh chị xem mẫu đc ạ
 
Upvote 0
Nếu như anh nói thế này thì độ tin cậy cao nè. Nếu như thế thì có thể có nhiều ý tưởng với cái này ấy nhỉ? Chẳng hạn đối chiếu ảnh cần duyệt với 1 cái ảnh gốc nào đó xem nó giống bao nhiêu % cũng được phải không anh?
Nhưng khổ nỗi độ ngu dốt của bản thân luôn lớn hơn độ thông minh.
Nhìn thì thèm mà không biết làm thế nào.hihi
Không dễ đâu bác ơi, code này chỉ là phần nổi mình viết ra. Còn phần chìm phía sau là cả một thư viện xử lý hình ảnh của nó. Gọi thư viện đó ra xử lý thôi, còn cái phần thư viện bên trong nó làm gì sao biết được. Nếu muốn hiểu thì phải ngồi đọc tài liệu về thư viện đó, bla bla ... :D
@BuiQuangThuan : Hình như nó xử lý liên quan tới pixel ảnh với tông màu gì đó.. cái này chịu :D
À, mà muốn chạy đoạn mã trên thì phải có môi trường Python phải không nhỉ? Thực tình là tôi từng cài Python nhưng không thành công nên tôi rất hiểu cái khổ khi bí mà không biết phải làm sao đập bí.
 
Upvote 0
Excel có giới hạn của nó. Cái gì cũng bắt nó làm thì ép quá.
Nhưng mức độ đói bài của dân GPE thì không có giới hạn.
Bất cứ cái gì có thể nhờ GPE làm giùm thì tội gì phải thủ công?

Bài này vốn không phải là vấn đề của Excel. Nhưng hỏi diễn đàn nào dễ bằng GPE?
 
Upvote 0
Nếu là mỗi code vậy thôi thì phải cài python nha bác, cài nó xong còn phải cài thư viện đang sử dụng trong code đó nữa.
Mấy cái nền tảng sử dụng nó lo hết.
Lâu lâu gặp ứng dụng đặc biệt thì mới phải đi tìm tải thêm.
Trên Mac, tôi dùng PyCharm. Trên Windows, tôi nghĩ Spyder là được rồi. Bạn nào quen với Visual Studio thì dùng VS Code cũng được.
 
Upvote 0
Ý bạn là 2 file trùng nhau nhưng "file size" lệch nhau vài byte à? Lần đầu tiên mới nghe tình huống này. Bạn xem lệch tối đa bao nhiêu rồi dùng phép chia lấy nguyên (\) để mà đối chiếu, chẳng hạn lệch 10 thì thực hiện phép so sánh size1\(10+1)=size2\(10+1). Còn so sánh theo "size on disk" thì sai số sẽ tăng lên một tý đấy. --=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) ạ
 

File đính kèm

  • 12345555.jpg
    12345555.jpg
    150.3 KB · Đọc: 18
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ạn cứ loại bớt giá trị ở hàng đơn vị, hàng chục hoặc hàng trăm là sẽ giải quyết được vấn đề nhé. Có nhiều cách để loại chẳng hạn để bỏ hàng đơn vị thì thực hiện phép tính X=(X\10)*10. Chú ý cái dấu "\" chứ không phả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"
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
Anh có thể cho em tham khảo được không ạ, Em áp vào nhưng bị báo lỗi ạ :p
Tôi nhân thêm hình thứ 8 nữa từ hình 7.JPG rồi chạy thủ tục TimHinhTrung. Kết quả chép vào ô C1 là đường dẫn đầy đủ của các file trùng (cần xóa đi)
 

File đính kèm

Upvote 0
Upvote 0
Upvote 0
Nhờ anh xem giúp em, làm thế nào để khi dữ liệu gắn ra ô "A2" chỉ là những ảnh trùng nhau thôi ạ. Cám ơn anh
Tôi chưa xem file bạn vì đang trên điện thoại.

Ý bạn là 2, 3, 4 trùng nhau thì phải liệt kê ra đủ, thay vì code của tôi ở bài #61 hoặc file exe của bài #63 kê ra file cần xóa 3 và 4 (vì trùng với 2)?

Nếu thế thì tôi chưa có giải pháp tối ưu.
 
Upvote 0
Tôi chưa xem file bạn vì đang trên điện thoại.

Ý bạn là 2, 3, 4 trùng nhau thì phải liệt kê ra đủ, thay vì code của tôi ở bài #61 hoặc file exe của bài #63 kê ra file cần xóa 3 và 4 (vì trùng với 2)?

Nếu thế thì tôi chưa có giải pháp tối ưu.
Dạ như bài #61 của anh thì do 1 thư mục của em có rất nhiều thư mục con và chứa rất nhiều hình (>10.000/1 thư mục) nên em không thể nhập (array) cho được ạ. Còn file ẽxe của bài #63 thì không liệt kê ra ễcl. Nên mong anh xem giúp e là liệt kê những ảnh trùng kèm đường dẫn thư mục lên excel ạ
Bài đã được tự động gộp:

Dạ như bài #61 của anh thì do 1 thư mục của em có rất nhiều thư mục con và chứa rất nhiều hình (>10.000/1 thư mục) nên em không thể nhập (array) cho được ạ. Còn file ẽxe của bài #63 thì không liệt kê ra ễcl. Nên mong anh xem giúp e là liệt kê những ảnh trùng kèm đường dẫn thư mục lên excel ạ
Dạ theo như mục đích thì cũng tương tự như ở bài #61 nhưng là do chạy từng hình của từng thư mục con trong thư mục tổng nên em không biết sửa như thế nào.
 
Upvote 0
Dạ như bài #61 của anh thì do 1 thư mục của em có rất nhiều thư mục con và chứa rất nhiều hình (>10.000/1 thư mục) nên em không thể nhập (array) cho được ạ. Còn file ẽxe của bài #63 thì không liệt kê ra ễcl. Nên mong anh xem giúp e là liệt kê những ảnh trùng kèm đường dẫn thư mục lên excel ạ
Bạn trả lời tôi câu hỏi: bạn muốn kê ra 2, 3, 4 hay là chỉ 3, 4? (Như bài #66 tôi đã hỏi)

Yêu cầu khác nói sau
 
Upvote 0
Cảm ơn anh nhé.
"ReDim aPic(1 To 10, 1 To 1)
ReDim aRes(1 To 10, 1 To 1)"
Nhưng 2 đoạn phần này em vẫn phải sửa mỗi khi số lượng ảnh thay đổi hả anh.
Tôi quên sửa đó. Bạn cho 2 dòng Redim đó xuống vị trí trên For i... và khai báo Redim(1 to iR... (bằng với số lượng ảnh trong folder). Tôi chỉnh lại luôn như sau:
Rich (BB code):
Sub TimAnhTrung()
  Dim i&, j&, k&, EndR&, Path$, aPic, aRes
  Dim MyFile_Full As String
  Dim FSO As Object, dic As Object
 
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set dic = CreateObject("Scripting.Dictionary")
    ReDim Arr(1 To 6000, 1 To 3)
    Path = "D:\TestGPE\HinhTest"   'Thay doi duong dan phu hop
    iR = 0
    ListFilesInFolder Path, True
    If Err.Number = 5 Then Exit Sub
    ReDim aPic(1 To iR, 1 To 1)
    ReDim aRes(1 To iR, 1 To 1)
    For i = 1 To iR
        aPic(i, 1) = FileToMD5Hex(Arr(i, 1) & "\" & Arr(i, 2))
        If Not dic.Exists(aPic(i, 1)) Then
            j = j + 1
            dic.Add aPic(i, 1), j
        Else
            k = k + 1
            aRes(k, 1) = Arr(i, 1) & "\" & Arr(i, 2)
        End If
    Next
    Set FSO = Nothing
    Set dic = Nothing
    Range("A2").Resize(10000, 1).ClearContents
    If k > 0 Then
        Range("A2").Resize(k, 1) = aRes
    Else
        MsgBox "Không có hình nào trùng."
    End If
End Sub
 
Upvote 0
Tôi quên sửa đó. Bạn cho 2 dòng Redim đó xuống vị trí trên For i... và khai báo Redim(1 to iR... (bằng với số lượng ảnh trong folder). Tôi chỉnh lại luôn như sau:
Rich (BB code):
Sub TimAnhTrung()
  Dim i&, j&, k&, EndR&, Path$, aPic, aRes
  Dim MyFile_Full As String
  Dim FSO As Object, dic As Object
 
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set dic = CreateObject("Scripting.Dictionary")
    ReDim Arr(1 To 6000, 1 To 3)
    Path = "D:\TestGPE\HinhTest"   'Thay doi duong dan phu hop
    iR = 0
    ListFilesInFolder Path, True
    If Err.Number = 5 Then Exit Sub
    ReDim aPic(1 To iR, 1 To 1)
    ReDim aRes(1 To iR, 1 To 1)
    For i = 1 To iR
        aPic(i, 1) = FileToMD5Hex(Arr(i, 1) & "\" & Arr(i, 2))
        If Not dic.Exists(aPic(i, 1)) Then
            j = j + 1
            dic.Add aPic(i, 1), j
        Else
            k = k + 1
            aRes(k, 1) = Arr(i, 1) & "\" & Arr(i, 2)
        End If
    Next
    Set FSO = Nothing
    Set dic = Nothing
    Range("A2").Resize(10000, 1).ClearContents
    If k > 0 Then
        Range("A2").Resize(k, 1) = aRes
    Else
        MsgBox "Không có hình nào trùng."
    End If
End Sub
Vâng, cám ơn a nhiều
 
Upvote 0
Bạn chạy thử rồi cho tôi (và tiện thể cho tác giả của bài #52) biết là tổng số file ảnh đã được duyệt qua là bao nhiêu và thời gian chạy khoảng bao nhiêu giây.
máy công ty em chạy thử thì báo lỗi "Error --80131700", sao khi cài "Frame 2.0 and 3.0" thì tiếp tục báo lỗi "Error -- 80131509" ở dòng
"enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")" này anh. Hiện em chưa chạy thử được do nguồn dữ liệu đều nằm ở trên cty, còn trên laptop thì chạy bình thường nên em chưa biết xử lý sao ạ :D
 
Upvote 0
máy công ty em chạy thử thì báo lỗi "Error --80131700", sao khi cài "Frame 2.0 and 3.0" thì tiếp tục báo lỗi "Error -- 80131509" ở dòng
"enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")" này anh. Hiện em chưa chạy thử được do nguồn dữ liệu đều nằm ở trên cty, còn trên laptop thì chạy bình thường nên em chưa biết xử lý sao ạ :D
Bịnh này thì phải chờ bác sĩ :wallbash::rolleyes:
 
Upvote 0
máy công ty em chạy thử thì báo lỗi "Error --80131700", sao khi cài "Frame 2.0 and 3.0" thì tiếp tục báo lỗi "Error -- 80131509" ở dòng
"enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")" này anh. Hiện em chưa chạy thử được do nguồn dữ liệu đều nằm ở trên cty, còn trên laptop thì chạy bình thường nên em chưa biết xử lý sao ạ :D
Frame 2.0 hay Net Framework 2.0?
Bạn kiếm bảng Net Framework mới nhất cài vô thử xem.
 
Upvote 0
Frame 2.0 hay Net Framework 2.0?
Bạn kiếm bảng Net Framework mới nhất cài vô thử xem.
em cài hết rồi á anh, xong chạy nó báo lỗi "Error -- 80131509" á :p.Để thứ 3 em chụp ảnh gửi các anh chị xem thử giúp em, chứ laptop em chạy ok hết mà lên máy cty lại bị thì em cũng bó tay rồi ạ :)
Chúc anh chị cuối tuần vui vẻ
 
Upvote 0
Bạn chạy thử rồi cho tôi (và tiện thể cho tác giả của bài #52) biết là tổng số file ảnh đã được duyệt qua là bao nhiêu và thời gian chạy khoảng bao nhiêu giây.
Hiện em chạy thử trên 1200 ảnh (6,5mb/1 ảnh) chạy tầm 3 phút. Lọc được 220 ảnh trùng nhau.
Còn nguồn gốc (>20000 ảnh (2mb/1 ảnh) đợi em test xong em báo lại sau ạ.
 
Upvote 0
Hiện em chạy thử trên 1200 ảnh (6,5mb/1 ảnh) chạy tầm 3 phút. Lọc được 220 ảnh trùng nhau.
Còn nguồn gốc (>20000 ảnh (2mb/1 ảnh) đợi em test xong em báo lại sau ạ.
Vậy là tốt đó chứ. Vậy mà bài #52 nói chạy treo máy luôn
 
Upvote 0
Vậy là tốt đó chứ. Vậy mà bài #52 nói chạy treo máy luôn
Hôm qua, tôi có thử tạo ra một script nhỏ chạy 1000 vòng (tương ứng 1000 file) với một file ảnh 882k để kiểm tra. Kết quả là hết 10s và tôi thấy cái điểm chuột quay vòng vòng cùng tiếng rú của quạt CPU. Vậy theo Maika8008 với hơn 20,000 ảnh 2mb (gấp 2,3 lần file thử nghiệm của tôi) thì máy tôi sẽ ngốn bao nhiêu thời gian và liệu nó có ngủm vì quá nhiệt CPU không?

Phân tích hiệu năng của 2 hàm GetFileBytes và FileToMD5Hex, và dù tiên đoán là FileToMD5Hex sẽ ngốn rất nhiều công lực nhưng tôi vẫn phải bất ngờ khi biết cái hàm FileToMD5Hex chiếm khoảng 80% thời gian thực thi. Và điều bất ngờ thứ 2 là nếu nạp vô hàm ComputeHash_2() 882k byte dữ liệu thì nó cho ra 20 byte dữ liệu và các bạn đem 20 byte này để xác định tính duy nhất của một file. Liệu có ai dám khẳng định là 20 byte kết xuất này sẽ đặc trưng cho một file hay là sẽ có một file khác cũng có chung 20 byte này sau khi nạp vô ComputeHash_2()?
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm qua, tôi có thử tạo ra một script nhỏ chạy 1000 vòng (tương ứng 1000 file) với một file ảnh 882k để kiểm tra. Kết quả là hết 10s và tôi thấy cái điểm chuột quay vòng vòng cùng tiếng rú của quạt CPU. Vậy theo Maika8008 với hơn 20,000 ảnh 2mb (gấp 2,3 lần file thử nghiệm của tôi) thì máy tôi sẽ ngốn bao nhiêu thời gian và liệu nó có ngủm vì quá nhiệt CPU không?

Phân tích hiệu năng của 2 hàm GetFileBytes và FileToMD5Hex, và dù tiên đoán là FileToMD5Hex sẽ ngốn rất nhiều hiệu năng nhưng tôi vẫn phải bất ngờ khi biết cái hàm FileToMD5Hex chiếm khoảng 80% thời gian thực thi. Và điều bất ngờ thứ 2 là nếu nạp vô hàm ComputeHash_2() 882k byte dữ liệu thì nó cho ra 20 byte dữ liệu và các bạn đem 20 byte này để xác định tính duy nhất của một file. Liệu có ai dám khẳng định là 20 byte kết xuất này sẽ đặc trưng cho một file hay là sẽ có một file khác cũng có chung 20 byte này?
Dạ em chạy thì điểm chuột quay vòng và cũng có nghe quạt cpu quay. Còn những phân tích của anh thì em không chuyên nên em không bàn đến. Nhưng xử lý về công việc của em thì đây cũng coi là giải pháp rồi á anh. Các anh có cách nào tối ưu thêm thì tốt quá ạ.:p
 
Upvote 0
à em mới mò được cách là giảm dung lượng của ảnh xuống và chạy thì nhanh hơn đó 2 anh (từ 6.5mb/1 ảnh xuống còn 6.5kb/1 ảnh).
Thôi thì em chịu khó nén ảnh xuống rồi chạy mã sau vậy :)
 
Upvote 0
Hôm qua, tôi có thử tạo ra một script nhỏ chạy 1000 vòng (tương ứng 1000 file) với một file ảnh 882k để kiểm tra. Kết quả là hết 10s và tôi thấy cái điểm chuột quay vòng vòng cùng tiếng rú của quạt CPU. Vậy theo Maika8008 với hơn 20,000 ảnh 2mb (gấp 2,3 lần file thử nghiệm của tôi) thì máy tôi sẽ ngốn bao nhiêu thời gian và liệu nó có ngủm vì quá nhiệt CPU không?

Phân tích hiệu năng của 2 hàm GetFileBytes và FileToMD5Hex, và dù tiên đoán là FileToMD5Hex sẽ ngốn rất nhiều công lực nhưng tôi vẫn phải bất ngờ khi biết cái hàm FileToMD5Hex chiếm khoảng 80% thời gian thực thi. Và điều bất ngờ thứ 2 là nếu nạp vô hàm ComputeHash_2() 882k byte dữ liệu thì nó cho ra 20 byte dữ liệu và các bạn đem 20 byte này để xác định tính duy nhất của một file. Liệu có ai dám khẳng định là 20 byte kết xuất này sẽ đặc trưng cho một file hay là sẽ có một file khác cũng có chung 20 byte này sau khi nạp vô ComputeHash_2()?
Băm MD5 hoặc SHA1 là 1 giải thuật đã được kiểm chứng và dùng rộng rãi. Bạn có thể không tin vào nó nhưng nó vẫn được dùng để làm nền tảng cho chữ ký số trên 1 văn bản điện tử.
 
Upvote 0
Băm MD5 hoặc SHA1 là 1 giải thuật đã được kiểm chứng và dùng rộng rãi. Bạn có thể không tin vào nó nhưng nó vẫn được dùng để làm nền tảng cho chữ ký số trên 1 văn bản điện tử.
Trước tiên phải cám ơn bạn đã giải thích cho tôi hiểu thêm về chức năng của hàm này nhưng vấn đề quan tâm nhất của tôi là nếu thực hiện với dữ liệu thực tế trên máy của tôi thì sẽ mất bao lâu thì vẫn chưa có câu trả lời(?).
 
Upvote 0
Trước tiên phải cám ơn bạn đã giải thích cho tôi hiểu thêm về chức năng của hàm này nhưng vấn đề quan tâm nhất của tôi là nếu thực hiện với dữ liệu thực tế trên máy của tôi thì sẽ mất bao lâu thì vẫn chưa có câu trả lời(?).
Đoán nhé:
Máy của chủ thớt chạy 1200 ảnh cỡ 6.5MB thì mất tầm 3 phút. Các máy bây giờ không chênh nhau lắm về cấu hình. Nếu chậm lắm thì máy bạn chạy với chừng đó file mất tối đa 5 phút.

Tôi làm thầy bói mù đấy __--__
 
Upvote 0
Đoán nhé:
Máy của chủ thớt chạy 1200 ảnh cỡ 6.5MB thì mất tầm 3 phút. Các máy bây giờ không chênh nhau lắm về cấu hình. Nếu chậm lắm thì máy bạn chạy với chừng đó file mất tối đa 5 phút.
Tôi chạy mô phỏng 1000 lần trên một file 2.19MB trong điều kiện không mở bất cứ ứng dụng nào khác thì hết 10s. Còn nếu có bật app Opera thì thời gian dao động trong khoảng 12-19s. Vậy thì với hơn 30.000 file thì hết ước chừng hết khoảng 310s với điều kiện không có ứng dụng nào khác được mở và CPU được giữ ổn định nhiệt.

Tuy nhiên tôi lại phát hiện ra một tình huống vô cùng lý thú. Theo anh chủ topic, 2 file trùng nhau nhưng kích thước có thể lệch nhau một số byte. Vậy thì kết quả hàm băm của 2 file này giống hay khác nhau?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi chạy mô phỏng 1000 lần trên một file 2.19MB trong điều kiện không mở bất cứ ứng dụng nào khác thì hết 10s. Còn nếu có bật app Opera thì thời gian dao động trong khoảng 12-19s. Vậy thì với hơn 30.000 file thì hết ước chừng hết khoảng 310s với điều kiện không có ứng dụng nào khác được mở và CPU được giữ ổn định nhiệt.

Tuy nhiên tôi lại phát ra một tình huống vô cùng lý thú. Theo anh chủ topic, 2 file trùng nhau nhưng kích thước có thể lệch nhau một số byte. Vậy thì kết quả hàm băm của 2 file này giống hay khác nhau?
2. Nếu hình quá nhiều như trường hợp của chủ thớt thì không nên ép Excel mà chia folder ra thành nhiều folder con để chạy.
3. Hai file hình nhìn thì trùng nhau nhưng chỉ cần khác nhau 1 pixel vào đó thì kết quả băm cũng đã khác nhau rồi. Bạn cứ thử băm 1 file Word, rồi mở file ấy thêm 1 dấu cách bất kỳ chỗ nào, lưu file rồi băm lại và so sánh 2 cái mã băm xem có khác nhau hoàn toàn không.
 
Upvote 0
Upvote 0
2. Nếu hình quá nhiều như trường hợp của chủ thớt thì không nên ép Excel mà chia folder ra thành nhiều folder con để chạy.
3. Hai file hình nhìn thì trùng nhau nhưng chỉ cần khác nhau 1 pixel vào đó thì kết quả băm cũng đã khác nhau rồi. Bạn cứ thử băm 1 file Word, rồi mở file ấy thêm 1 dấu cách bất kỳ chỗ nào, lưu file rồi băm lại và so sánh 2 cái mã băm xem có khác nhau hoàn toàn không.
Tôi tiếp tục phát hiện ra 2 vấn đề trong luận điểm Maika8008 ở đây:
  1. Maika8008 có dự tính được tính huống 2 file giống nhau lại được chia ra nằm ở 2 folder khác nhau và dẫn đến là chúng bị bỏ lọt vì không được đối chiếu không nhỉ?
  2. Nếu 2 file ảnh trùng nhau nhưng chỉ sai khác một vài byte thì bằng phép so sánh với hàm băm chúng bị coi là khác nhau (không trùng) và cũng lọt qua phép sàng lọc.
Tóm lại theo phương án dùng hàm băm:
  1. Để cải thiện trải nghiệm (nhưng không cải thiện được hiệu năng) thì phải chấp nhận sai số.
  2. Vì hàm băm dùng phép so sánh tuyệt đối nên bỏ sót những file trùng nhau nhưng sai khác vài byte tức là vẫn có sai số.
Nghĩa là sau khi chạy xong theo phương án Maika8008 nêu ra, thì anh chủ topic sẽ lại phải dùng phương pháp thủ công để đối chiếu trong mấy chục ngàn file để tìm ra số file trùng lắp bị bỏ sót. Và phương pháp thủ công hiệu quả nhất thì chắc là của tôi rồi nhưng vẫn khá tốn cơm và mỏi mắt đấy --=0 Còn không thì phải dùng app chẳng hạn như ACD... gì đấy
 
Upvote 0
Đúng như bạn Maika8008 đã nói, đối với hàm băm MD5 thì khác 1 byte cũng sẽ cho kết quả khác nhau. Và cũng có trường hợp 2 file khác nhau hoàn toàn nhưng có cùng MD5 hash và trường hợp này tỷ lệ vô cùng hiếm. Và cũng có trường hợp 2 MD5 hash giống nhau nhưng file khác nhau, các chuyên gia hack đã làm được. Do đó bây giờ muốn bảo mật cao hơn nữa thì dùng SHA 256. Tuy "nhiên trong trường hợp tìm file trùng này thì hàm MD5 đã quá đủ để dùng rồi.

Nhắc với bạn chủ thớt là so sánh dùng "Size on Disk" là không chính xác nhé, file size là chính xác nhất . Size on disk tùy thuộc vào việc phân chia kích thước vùng nhớ tối thiểu (Allocation unit) của hệ điều hành áp dụng cho một kiểu định dạng ổ cứng nào đó. Thông thường Windows sẽ phân bổ tối thiếu 4096 bytes (trên máy Mac tôi cũng vậy)

Screen Shot 2022-04-12 at 11.07.00.png

Nếu định dạng khác sẽ có kích thước khác: exFAT

Screen Shot 2022-04-12 at 11.08.33.png

Ví dụ: lấy từ cái hình chủ thớt đưa lên.

Screen Shot 2022-04-12 at 12.25.09.png

1 file có Size: 1.313.046 bytes, file kế có size: 1.313.064 --> khác nhau 18 bytes nhưng Size on Disk lại bằng nhau?
- File 1: nếu được phân bổ 320 units trên ổ cứng (để lưu) x 4096 = 1.310.720 bytes --> không đủ chứa file 1 <=> Windows sẽ cấp 321 units x 4096 = 1.314.816 bytes.
- File 2: tương tự 320 units cũng không đủ chứa nên được phân bổ 321 units ổ cứng <=> dung lượng Size on Disk như nhau.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi tiếp tục phát hiện ra 2 vấn đề trong luận điểm Maika8008 ở đây:
  1. Maika8008 có dự tính được tính huống 2 file giống nhau lại được chia ra nằm ở 2 folder khác nhau và dẫn đến là chúng bị bỏ lọt vì không được đối chiếu không nhỉ?
  2. Nếu 2 file ảnh trùng nhau nhưng chỉ sai khác một vài byte thì bằng phép so sánh với hàm băm chúng bị coi là khác nhau (không trùng) và cũng lọt qua phép sàng lọc.
Tóm lại theo phương án dùng hàm băm:
  1. Để cải thiện trải nghiệm (nhưng không cải thiện được hiệu năng) thì phải chấp nhận sai số.
  2. Vì hàm băm dùng phép so sánh tuyệt đối nên bỏ sót những file trùng nhau nhưng sai khác vài byte tức là vẫn có sai số.
Nghĩa là sau khi chạy xong theo phương án Maika8008 nêu ra, thì anh chủ topic sẽ lại phải dùng phương pháp thủ công để đối chiếu trong mấy chục ngàn file để tìm ra số file trùng lắp bị bỏ sót. Và phương pháp thủ công hiệu quả nhất thì chắc là của tôi rồi nhưng vẫn khá tốn cơm đấy --=0
Vấn đề 1: Tạm thời tôi chưa có phương án chia ra chạy, rồi gộp lại chạy tiếp thế nào để khỏi bỏ sót nhưng nếu là dữ liệu của tôi thì tôi sẽ tìm ra, vì: tôi sẽ biết dữ liệu hình của tôi trùng vì lý do gì, khác folder con thì có trùng không... và cuối cùng là tôi có động cơ để đầu tư suy nghĩ.
Vấn đề 2: Trên thực tế làm gì ai đem ra hình ra thêm 1 dấu chấm Save As lại rồi cho đó là hình trùng nhau được. Đã sửa 1 tí là phải xem là hình khác rồi. Hình trùng khi ai đó đem nhân bản ra trên máy tính thôi.
 
Upvote 0
Vấn đề 1: Tạm thời tôi chưa có phương án chia ra chạy, rồi gộp lại chạy tiếp thế nào để khỏi bỏ sót nhưng nếu là dữ liệu của tôi thì tôi sẽ tìm ra, vì: tôi sẽ biết dữ liệu hình của tôi trùng vì lý do gì, khác folder con thì có trùng không... và cuối cùng là tôi có động cơ để đầu tư suy nghĩ.
Thực ra vấn đề này cũng chỉ là thêm code, thêm bước để xử lý thôi và chắc chắn là nó sẽ làm chậm đi tiến trình.

Screen Shot 2022-04-12 at 13.01.29.png


Dùng MD5 để tìm các file giống nhau hoàn toàn. Nó cũng dùng được để tìm file ảnh nhưng chỉ là tương đối như bài #57 tôi đã đề cập. Muốn xác định file ảnh trùng theo tiêu chí gì, thuật toán nó sẽ phức tạp hơn chứ không đơn giản là so sánh 1 với 1.
Tôi có đính kèm 3 file ảnh: 21.jpg, 22.jpg, 23.jpg. Ba file nhìn bình thường sẽ rất giống nhau.
Tôi chỉ nâng sánh 1 đơn vị cho file 22.jpg nhưng size nó đã khác nhau 2kb.
File 23.jpg có thêm con chó nhưng size nó chỉ tăng chừng 500 bytes
Do đó nếu so sánh size không thôi thì khó chính xác nếu theo tiêu chí: nội dung hình giống nhau.
 

File đính kèm

  • 21.jpg
    21.jpg
    186.6 KB · Đọc: 1
  • 22.jpg
    22.jpg
    187.3 KB · Đọc: 1
  • 23.jpg
    23.jpg
    187.1 KB · Đọc: 1
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề 1: Tạm thời tôi chưa có phương án chia ra chạy, rồi gộp lại chạy tiếp thế nào để khỏi bỏ sót nhưng nếu là dữ liệu của tôi thì tôi sẽ tìm ra, vì: tôi sẽ biết dữ liệu hình của tôi trùng vì lý do gì, khác folder con thì có trùng không... và cuối cùng là tôi có động cơ để đầu tư suy nghĩ.
Vấn đề 2: Trên thực tế làm gì ai đem ra hình ra thêm 1 dấu chấm Save As lại rồi cho đó là hình trùng nhau được. Đã sửa 1 tí là phải xem là hình khác rồi. Hình trùng khi ai đó đem nhân bản ra trên máy tính thôi.
Với vấn đề 1 Maika8008 nêu thì nghĩa là phải trong "điều kiện lý tưởng" phù hợp với khả năng giải quyết của Maika8008 chứ với các tình huống hỗn độn thì sẽ ra sao nhỉ? Vấn đề thứ 2 là có sự sai khác một vài byte giữa 2 ảnh trùng nhau khiến việc sàng lọc bị sai sót và đây là nguyên do đáng kể khiến anh chủ topic bỏ phương án của tôi mà theo phương án của Maika8008. Tuy nhiên có vẻ phương án của Maika8008 cũng đang bị vấn đề này và chắc không có phương án khắc phục.

Nếu không ngại dư luận, anh chủ topic chắc phải quay lại phương án của tôi vì nó cho phép sai số. Và có một điều nữa là phương án của tôi vẫn rộng cửa nâng cấp để đạt độ chính xác tốt hơn nữa. Còn riêng về hiệu năng, tôi bảo đảm sẽ có sự kinh ngạc về thời gian thực thi so với con số ước lượng hơn 300s của code Maika8008 trên máy tôi hiện tại.
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng như bạn Maika8008 đã nói, đối với hàm băm MD5 thì khác 1 byte cũng sẽ cho kết quả khác nhau. Và cũng có trường hợp 2 file khác nhau hoàn toàn nhưng có cùng MD5 hash và trường hợp này tỷ lệ vô cùng hiếm. Và cũng có trường hợp 2 MD5 hash giống nhau nhưng file khác nhau, các chuyên gia hack đã làm được. Do đó bây giờ muốn bảo mật cao hơn nữa thì dùng SHA 256. Tuy "nhiên trong trường hợp tìm file trùng này thì hàm MD5 đã quá đủ để dùng rồi.

Nhắc với bạn chủ thớt là so sánh dùng "Size on Disk" là không chính xác nhé, file size là chính xác nhất . Size on disk tùy thuộc vào việc phân chia kích thước vùng nhớ tối thiểu (Allocation unit) của hệ điều hành áp dụng cho một kiểu định dạng ổ cứng nào đó. Thông thường Windows sẽ phân bổ tối thiếu 4096 bytes (trên máy Mac tôi cũng vậy)

View attachment 274327

Nếu định dạng khác sẽ có kích thước khác: exFAT

View attachment 274328

Ví dụ: lấy từ cái hình chủ thớt đưa lên.

View attachment 274330

1 file có Size: 1.313.046 bytes, file kế có size: 1.313.064 --> khác nhau 18 bytes nhưng Size on Disk lại bằng nhau?
- File 1: nếu được phân bổ 320 units trên ổ cứng (để lưu) x 4096 = 1.310.720 bytes --> không đủ chứa file 1 <=> Windows sẽ cấp 321 units x 4096 = 1.314.816 bytes.
- File 2: tương tự 320 units cũng không đủ chứa nên được phân bổ 321 units ổ cứng <=> dung lượng Size on Disk như nhau.
Vâng anh, em đã ngừng phương pháp so sánh bằng "size on disk" rồi ạ, Và đang xài hàm băm MD5.
Bài đã được tự động gộp:

Với vấn đề 1 Maika8008 nêu thì nghĩa là phải trong "điều kiện lý tưởng" phù hợp với khả năng giải quyết của Maika8008 chứ với các tình huống hỗn độn thì sẽ ra sao nhỉ? Vấn đề thứ 2 là có sự sai khác một vài byte giữa 2 ảnh trùng nhau khiến việc sàng lọc bị sai sót và đây là nguyên do đáng kể khiến anh chủ topic bỏ phương án của tôi mà theo phương án của Maika8008. Tuy nhiên có vẻ phương án của Maika8008 cũng đang bị vấn đề này và chắc không có phương án khắc phục.

Nếu không ngại dư luận, anh chủ topic chắc phải quay lại phương án của tôi vì nó cho phép sai số. Và có một điều nữa là phương án của tôi vẫn rộng cửa nâng cấp để đạt độ chính xác tốt hơn nữa. Còn riêng về hiệu năng, tôi bảo đảm sẽ có sự kinh ngạc về thời gian thực thi so với con số ước lượng hơn 300s của code Maika8008 trên máy tôi hiện tại.
Vâng mọi ý kiến đóng góp của các anh chị rất tuyệt vời ạ. Nhưng em đang tính nếu mình chạy hàm băm và hàm "size" sau đó so sánh nếu cả 2 cùng trùng nhau thì ==> ảnh đó trùng nhau, còn 1 trong 2 khác nhau thì là khác nhau. Không biết có được không ạ. Mong anh chị góp ý thêm
Bài đã được tự động gộp:

Còn nếu excel dừng lại ở đó thì em xin phép anh maika8008 ở bài #63 có thể làm thêm ở (tool .exe của python tìm ảnh trùng và báo(xuất) ra file excel) để em có thể kiểm tra được không ạ. Cảm ơn a nhiều
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom