Soyez le premier à donner votre avis sur cette source.
Vue 21 482 fois - Téléchargée 831 fois
#Region "Comparer deux images" 'PARAMETRES: 'verifierProportions: si ce parametre est à true, on différencie les images de proportions différentes (ex: 9*10 et 10*10) -tolérance de 1% 'TailleEchantillon: définit la taille de la miniature qui sera utilisée pour la comparaison. La fonction est plus rapide sur un echantillon proche de 1 et plus précise (et moins tolérante) si l'échantillon est loin de 1. Par experience 25 donne des résultats satisfaisants pour moi. 'toleranceDeCouleur: nombre entre 0 et 255 qui définit la différence de couleur autorisée sur chaque canal Public Function ComparerDeuxImages(ByVal image1 As Image, ByVal image2 As Image, Optional ByVal verifierProportions As Boolean = True, Optional ByVal TailleEchantillon As Integer = 25, Optional ByVal toleranceDeCouleur As Byte = 5) As Boolean 'Je fais un premier test rapide de couleur et de forme pour débusquer les images très différentes: If FonctionComparaisonImages(image1, image2, verifierProportions, 1, toleranceDeCouleur) = False Then Return False '-->elles sont tres différentes Else 'si je les trouve proche, je confirme par un test plus précis, mais sans revérifier les proportions (déja fait si demandé) If FonctionComparaisonImages(image1, image2, False, TailleEchantillon, toleranceDeCouleur) = False Then Return False '--> elles ne sont pas suffisemment proches pour être considérées identiques Else Return True '--> elles sont semblables End If End If End Function Private Function FonctionComparaisonImages(ByVal image1 As Image, ByVal image2 As Image, Optional ByVal verifierProportions As Boolean = True, Optional ByVal TailleEchantillon As Integer = 25, Optional ByVal toleranceDeCouleur As Byte = 5) As Boolean 'vérifier que les images ont les memes proportions If verifierProportions = True Then If Math.Abs(image1.Height / image2.Height - image1.Width / image2.Width) >= 0.01 Then Return False End If 'vérifier la précision: If TailleEchantillon < 1 Then TailleEchantillon = 1 If TailleEchantillon > image1.Width Then TailleEchantillon = image1.Width If TailleEchantillon > image2.Width Then TailleEchantillon = image2.Width If TailleEchantillon > image1.Height Then TailleEchantillon = image1.Height If TailleEchantillon > image2.Height Then TailleEchantillon = image2.Height 'On fait une miniature carrée des deux images que l'on va comparer 'IMAGE1 Dim Thumb1 As New Bitmap(TailleEchantillon, TailleEchantillon) Dim Graph1 As Graphics = Graphics.FromImage(Thumb1) Graph1.InterpolationMode = Drawing2D.InterpolationMode.Low Graph1.DrawImage(image1, New Rectangle(0, 0, TailleEchantillon, TailleEchantillon)) Graph1.Dispose() 'IMAGE2 Dim Thumb2 As New Bitmap(TailleEchantillon, TailleEchantillon) Dim Graph2 As Graphics = Graphics.FromImage(Thumb2) Graph2.InterpolationMode = Drawing2D.InterpolationMode.Low Graph2.DrawImage(image2, New Rectangle(0, 0, TailleEchantillon, TailleEchantillon)) Graph2.Dispose() Dim temp1 As Integer Dim temp2 As Integer 'pour chaque pixel des images miniatures on vérifie que les couleurs RGB sont identiques à la toleranceDeCouleur près For x As Integer = 0 To TailleEchantillon - 1 For y As Integer = 0 To TailleEchantillon - 1 temp1 = (Thumb1.GetPixel(x, y).B) temp2 = (Thumb2.GetPixel(x, y).B) If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False temp1 = (Thumb1.GetPixel(x, y).G) temp2 = (Thumb2.GetPixel(x, y).G) If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False temp1 = (Thumb1.GetPixel(x, y).R) temp2 = (Thumb2.GetPixel(x, y).R) If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False Next Next 'si on est pas encore sorti de la fonction les images sont similaires: Return True End Function #End Region
27 mai 2012 à 00:09
Merci pour ta réponse.
L'image du dossier n'était qu'à titre d'exemple.
Par exemple dans plusieurs images, je cherche une meme image mais à position différente.
En gros sa balayerai des coin xy haut gauche de ton ecran jusque bas droit, comme le code cherche pixel qui à été déposé.
Mais à la place d'un pixel, et bien un groupe de pixel.
26 mai 2012 à 23:18
Utilise plutôt l'object filesystemwatcher() inclus en natif en vb.net pour surveiller les activités de ton dossier. Les positions des icones et le format d'affichage doivent être dans un fichier caché dans ton dossiers desktop, à ta place je chercherais plus dans ce sens, tu auras un code rapide grace aux objects de windows.
19 mai 2012 à 11:07
Dis moi, j'espère que je pollue pas trop ton poste, mais j'aurai une petite question.
Dans cette source, tu explique comment comparer deux images en connaissant ces coordonnée X, Y.
Serai t-il possible, de chercher une image sans connaitre ces coordonnées ?
Par exemple je cherche l'image d'un dossier sur le bureau, il detecte la position et me l'affiche dans un textbox.. et à chaque fois que je bouge le dossier, le textbox se met à jours.
Je suppose que ce sera avec une boucle et que le traitement sera beaucoup plus lourd.
Merci d'avance et désolé de squatter ta source x)
17 mai 2012 à 00:06
17 mai 2012 à 00:05
Je vois un peu tard (^^) que je n'avais pas donné suite à ton message.
Ok merci pour le complément d'information.
Je me sert de ton code et il est 100% opérationnel, merci encore.
A plus tard.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.