W jaki sposób znaleźć dwa dokładnie takie same pliki graficzne pod różnymi nazwami w delphi?

0

Mam w katalogu różne pliki jpg wśród których 2 mają różne nazwy, ale są to takie same pliki. W jaki sposób do tego wybranego, znanego pliku znaleźć jego duplikat, który różni się od niego tylko nazwą?

5

Przybliżenie 1-sze sortujesz wg rozmiaru identyczny plik ma identyczny rozmiar.
Jeżeli mają identyczny rozmiar to porównać kilka próbek jak są identyczne to lecisz blokami.

1

Jeśli nie są dokładnie identyczne to możesz użyć feature matching, wcześniej filtrować pliki pod typem czy są image czy nie, nie ma sensu nie obrazkowych formatów sprawdzać.

1

Można również skorzystać z ImageMagic. Jest tam fukcja compare.

3

Pytanie: w tytule wątku zaznaczyłeś, że chodzi o pliki graficzne i tworzy to pewne niedomówienie/niejednoznaczność. Bo możliwe są teraz 2 opcje, w zależności od tego, czy to ma znaczenie, że mówimy o plikach graficznych:

  • nie ma znaczenia, że to graficzny i nie interesuje nas zawartość pliku: wtedy robisz tak, jak @_13th_Dragon zasugerował, czyli starasz się dopasować rozmiarem i jeśli znajdziesz dwa pliki o takiej samej wielkości, to porównaj ich zawartość
  • jeśli chodzi o pliki graficzne - w sensie, że czy obrazek w nich zapisany jest taki sam, to już trudniej. Bo taki sam obrazek zapisany jako PNG i np. BMP będzie miał inną wielkość i inną zawartość pliku na dysku, ale efekt końcowy (po jego wyświetleniu) będzie identyczny. A co za tym idzie - jeśli interesuje Cię porównanie zawartości/obrazków zapisanych w plikach, a nie samych plików, to jest to do wykonania, ale sprawa się komplikuje.
1

chyba najpewniejszą opcją będzie wyliczyć hash tych plików. Tylko nie wiem jak z wydajnością?

3
robertz68 napisał(a):

chyba najpewniejszą opcją będzie wyliczyć hash tych plików. Tylko nie wiem jak z wydajnością?

To akurat strasznie niepewne, a wydajność dokładnie taka sama jak sprawdzenie całości, bo największe straty czasowe to odczyt plików.

2

@robertz68: co do liczenia hashów - nie do końca się zgadzam:

  1. jeśli pliki mają inny rozmiar to szkoda czasu na liczenie hashów, skoro od razu wiadomo, że to są różne pliki
  2. wyliczenie hasha zeżre tyle samo czasu, co porównanie - bo żeby stworzyć hash, to trzeba cały plik wczytać z dysku i przetworzyć. A na ogół najwolniejszym elementem takiej akcji są operacje dyskowe. Nawet SSD jest o kilka rzędów wielkości wolniejszy od czytania/pisania z/do RAM.
  3. Jest ryzyko, wprawdzie niewielkie, ale niezerowe, że hash różnych plików wyjdzie taki sam. Kolizji funkcji skrótu nie unikniesz, a w tym przypadku taki błąd może spowodować dość nieodwracalne straty - np. uzna, że dwa pliki są identyczne (mimo, że nie są) i jeden z nich zostanie skasowany. A zanim zauważysz, że coś zostało skasowane - będzie zdecydowanie za późno na odkręcenie.
2

Podstawowe pytanie — to ma być jednorazowa operacja, czy usuwanie duplikatów ma być wykonywane regularnie?

Jeśli jednorazowa, to nie ma znaczenia jak się to zrobi (wydajnie czy nie). Ale mimo wszystko kluczowy jest tutaj rozmiar pliku, bo z góry wiadomo, że duplikaty mają taki sam rozmiar. Załadować listę plików do słownika (nazwa, rozmiar), posortować, pętlą od końca usunąć duplikaty.

0

Odświeżę trochę temat. Okazuje się że te dwie identyczne grafiki jpg mają różny stopień kompresji i pliki jednak nie są identyczne jeśli chodzi o rozmiar. @cerrato podał, że piksele trochę się różnią przy różnej kompresji. Jeśli piksele się różnią tylko trochę, to może jakoś porównywać różnice tych pikseli(zmienność) w R, G, B, a nie same R,G,B?

2

W przypadku .jpg na granicach bitmapy różnica między pikselami może być spora.

1

A tak w ogóle to ile jest tych plików?

0
furious programming napisał(a):

A tak w ogóle to ile jest tych plików?

kilka, kilkadziesiąt, kilkaset może być.

Wielkość tych 2 porównywanych plików jest identyczna w windosowym paint

1

@Romlus moim skromnym zdaniem skorzystaj z gotowych programów które potrafią wyszukiwać duplikaty w plikach graficznych.
teraz jestem w drodze ale jutro podam Ci nazwę programu ktory sam używam od wielu lat i dziala zaskakująco dobrze w stosunku do rozmiaru EXE :D

0
Adamek Adam napisał(a):

@Romlus moim skromnym zdaniem skorzystaj z gotowych programów które potrafią wyszukiwać duplikaty w plikach graficznych.
teraz jestem w drodze ale jutro podam Ci nazwę programu ktory sam używam od wielu lat i dziala zaskakująco dobrze w stosunku do rozmiaru EXE :D

Ok. Tak też mogę zrobić. Jaki to byłby program?

0

Dobra. Zamykam temat. Znalazłem program DuplicateHunter.

0

kilka, kilkadziesiąt, kilkaset może być.

Przy tak niewielkiej liczbie plików i jednorazowej potrzebie wyszukania duplikatów, na początek eliminujesz pliki o różnym rozmiarze. A te które mają taki sam rozmiar porównujesz binarnie. Może nie jest to optymalny czasowo algorytm, ale jest w 100% skuteczny

0

Ja od wielu lat używam "antitwin" https://antitwin.org/en/guide.html
Ja bym w 864 KB nie dał rady tyle zrobić :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1