Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRI DE COLLECTION D'IMAGES : COMPARE ET LISTE


Information sur la source

Catégorie :Fichier / Disque Niveau : Initié Date de création : 27/03/2003 Date de mise à jour : 21/05/2003 20:44:23 Vu / téléchargé: 7 457 / 606

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Pour se débarasser des doublons d'images dans les "bibliothèques d'images" (ou photos) perso, de son dd.

Ce programme fonctionne en deux temps :
1/ il recherche tout les fichiers images contenu dans le dossier et sous-dossiers, puis il en extrait les informations de dimensions XY, format et taille du fichier.
A partir de cette liste, il compare les dimensions des images pour trouver les résolutions identique, puis validé si le format et/ou la taille sont identique
2/ il ouvre les image et réalise une comparaison pixel par pixel des images qui "semble identique" avec le test 1

Une fenêtre de bilan (rapport) ainsi que de prévisu (visio) est disponible pour lire les résultats de l'analyse.

grâçe au système de recherche en 2 passes, dont l'une pour le de dégrossissement étant très rapide (100% en ram), on atteint des performance de 10 minutes de travail pour trouvé 900 images identique dans une collection de 17000 images (et grâçe au rapport, on a vu que un dossier complet étais dupliqué) sur un système 1GHz, là où des freeware mettent 5 jours!

interêt de la source :
- recherche dans les dossiers et sous-dossier avec la fonction Dir()
- récupération des headers des fichiers BMP, JPG, GIF et PNG (plus a venir)
- ouverture bitmap et comparaison bit-à-bit beaucoup plus rapide que GetPixel ou .Point grâçe à GetBitmapBits (alter-ego de GetDIBits)
- et en plus les résultats sont exhaustif à 99,5% :)

remarques :
- Si l'image est corrompu ou partiellement endommagé, le programme l'ignorera.
- Certain fichiers portant l'extension .jpg ne sont pas au format JFIF mais Exif (cas des photos numérique) et le programme à quelques difficultés à trouvé les dimensions XY de ces dernières (considéré alors comme = 0, donc ignoré par les tests)

Pensez à compilé le programme, il est 30% plus rapide en version .exe !    
 

Source

  • 'beaucoup trop long, voir Zip
  • 'extrait de CompKern.bas : la récupération de la résolution XY :
  • Private Sub GET_PicXYRes(InFormat As Long, OutXres As Long, OutYres As Long)
  • Dim bMarker As Byte
  • Dim iLength As Byte
  • Dim lSeek As Long
  • Dim iXres As Integer
  • Dim iYres As Integer
  • Dim Checking As Integer
  • Dim HWtbl(1 To 4) As Byte
  • Dim JpegDebug As Long
  • Select Case InFormat
  • Case 1 ' BMP
  • Get #1, 19, OutXres
  • Get #1, 23, OutYres
  • Case 2 ' JPG
  • 'le format JPEG standard est rarement respecté, aussi il faut procéder a différent "saut"
  • 'avant de trouver le marqueur SOF0, auquel est rattaché la résolution
  • Get #1, 3, Checking
  • If Checking <> &HE0FF Then
  • 'non-JFIF (exif ?)
  • i = 5
  • ts = LOF(1) - 1
  • Do Until Checking = &HE0FF Or Checking = &HD8FF Or Checking = &HC0FF
  • Get #1, i, Checking
  • i = i + 1
  • If i >= ts Then
  • 'format jpeg incompatible ou inconnu
  • OutXres = 0
  • OutYres = 0
  • Exit Sub
  • End If
  • Loop
  • lSeek = i
  • Else
  • 'JFIF
  • lSeek = 21
  • End If
  • JpegMarkSeek:
  • Get #1, lSeek, bMarker
  • If bMarker = 255 Then
  • Get #1, lSeek + 1, bMarker
  • If bMarker >= 192 And bMarker <= 195 Then 'marqueur SOF0 , SOF1 ou SOF2 de base
  • Get #1, lSeek + 5, HWtbl
  • OutYres = HWtbl(1) * 256 + HWtbl(2)
  • OutXres = HWtbl(3) * 256 + HWtbl(4)
  • 'OutXres = CLng(iXres)
  • 'OutYres = CLng(iYres)
  • Get #1, LOF(1) - 1, Checking
  • If Checking <> &HD9FF And Checking <> 0 Then
  • 'image buggé (fin incorrect)
  • OutXres = 0
  • OutYres = 0
  • End If
  • Else
  • lSeek = lSeek + 1
  • GoTo JpegMarkSeek
  • End If
  • Else
  • lSeek = lSeek + 1
  • GoTo JpegMarkSeek
  • 'non-JFIF
  • OutXres = 0
  • OutYres = 0
  • End If
  • Case 3 ' GIF
  • Get #1, 7, iXres
  • Get #1, 9, iYres
  • OutXres = CLng(iXres)
  • OutYres = CLng(iYres)
  • Case Else
  • OutXres = 0
  • OutYres = 0
  • End Select
  • End Sub
'beaucoup trop long, voir Zip

'extrait de CompKern.bas : la récupération de la résolution XY :
Private Sub GET_PicXYRes(InFormat As Long, OutXres As Long, OutYres As Long)
Dim bMarker As Byte
Dim iLength As Byte
Dim lSeek As Long
Dim iXres As Integer
Dim iYres As Integer
Dim Checking As Integer
Dim HWtbl(1 To 4) As Byte
Dim JpegDebug As Long

Select Case InFormat
Case 1 ' BMP
    Get #1, 19, OutXres
    Get #1, 23, OutYres
Case 2 ' JPG
    'le format JPEG standard est rarement respecté, aussi il faut procéder a différent "saut"
    'avant de trouver le marqueur SOF0, auquel est rattaché la résolution
    
    Get #1, 3, Checking
    If Checking <> &HE0FF Then
        'non-JFIF (exif ?)
        i = 5
        ts = LOF(1) - 1
        Do Until Checking = &HE0FF Or Checking = &HD8FF Or Checking = &HC0FF
            Get #1, i, Checking
            i = i + 1
            If i >= ts Then
                'format jpeg incompatible ou inconnu
                OutXres = 0
                OutYres = 0
                Exit Sub
            End If
        Loop
        lSeek = i
    Else
        'JFIF
        lSeek = 21
    End If
    
    
JpegMarkSeek:
    Get #1, lSeek, bMarker
    If bMarker = 255 Then
        Get #1, lSeek + 1, bMarker
        If bMarker >= 192 And bMarker <= 195 Then  'marqueur SOF0 , SOF1 ou SOF2 de base
            Get #1, lSeek + 5, HWtbl
            OutYres = HWtbl(1) * 256 + HWtbl(2)
            OutXres = HWtbl(3) * 256 + HWtbl(4)
            'OutXres = CLng(iXres)
            'OutYres = CLng(iYres)
            
            
            Get #1, LOF(1) - 1, Checking
            If Checking <> &HD9FF And Checking <> 0 Then
                'image buggé (fin incorrect)
                OutXres = 0
                OutYres = 0
            End If
        
        Else
            lSeek = lSeek + 1
            GoTo JpegMarkSeek
        End If
        
    Else
        lSeek = lSeek + 1
        GoTo JpegMarkSeek

        'non-JFIF
        OutXres = 0
        OutYres = 0
    End If
Case 3 ' GIF
    Get #1, 7, iXres
    Get #1, 9, iYres
    OutXres = CLng(iXres)
    OutYres = CLng(iYres)
Case Else
    OutXres = 0
    OutYres = 0
End Select
End Sub    

Conclusion

mode d'emploi :

1/ choisissez le dossier de base de votre collection d'image a trier

2/ cliquer sur "build" pour lister les images existantes

3/ cliquer sur "begin" pour entamer le comparatif rapide puis bit-à-bit.

4/ cliquer, le cas échéant (résultat &gt; 0) sur "visio" et "rapport" pour connaitre les images en double trouvé.


bug connus :
- quelques format jpeg corrompu/malformé non géré.

update mai 2003 :
- module Dir.bas optimisé (vitesse +5% )
- module CompKern.bas optimisé (vitesse pass1 x10! )
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Skywalker13 le 27/03/2003 22:11:30

sa ma fait un dépassement de capacité ici : iXres = HWtbl(3) * 256 + HWtbl(4)

après avoir tenter dans un répertoire contenant 650 images.. peut etre que le probleme vient d'une de mes images qui serait corrompue.. dans ce cas un ptit on erreor pourrait corriger le tire..

signaler à un administrateur
Commentaire de Proger le 27/03/2003 23:47:48

Image jif au format bizarre.
correctif :
remplacer iXres par OutXres et pour la ligne du dessus, iYres par OutYres .
have fun!

signaler à un administrateur
Commentaire de Skywalker13 le 28/03/2003 21:04:25

Bien que j'ai fais appliqué ton correctif.. j'ai toujours un dépassement de capacité a : OutXres = HWtbl(3) * 256 + HWtbl(4)

signaler à un administrateur
Commentaire de VicoLaChips2 le 29/03/2003 11:22:11

Très bon travail !!
Je n'ai pas modifié le code si ce n'est la nature des variables de types Integer que j'ai changer en Long (en faisant "Remplacer...", portée : Projet).

J'ai traité 5500 images, j'ai eu 2088 doublons sur la première étape et 117 sur la deuxième.

Une petite suggestion. Dans la fenêtre rapport ce serait bien que l'action du clique sur le bouton Kill fasse aussi passer à la photo suivante. Ou alors qu'il y ait une possibilité de tout effacer en bloque.

Ma note --&gt; 10/10

@+, VIC

signaler à un administrateur
Commentaire de Proger le 29/03/2003 13:40:34

Convertir tout les integer en long ! malheureux! le type integer sert uniquement pour la récupération des données dans les fichiers qui sont sur deux octets (long étant sur 4) il est fort probable que ça ai influé sur la construction de la liste! - à vérifier (d'où un surplus de doublon théorique...?)
La fonction "kill!" : en fait tu choisi toute les images a supprimer, et une fois la selection faite, tu cliques sur "valider" et le prog supprimera d'un coup toute la liste de choix.  Je n'aime pas trop cette methode de suppression, manque de sécurité. Vé faire ta suggestion, c pas bête :)
Merci.
Skywalker13, essaye de savoir quel image est à l'origine de cette erreur, pour débogué il faut que je puisse faire le test chez moi.

signaler à un administrateur
Commentaire de Skywalker13 le 29/03/2003 18:29:34

ah bah non y a plus de problème... en ayant compilé le prog sa marche..

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.