comparaison d'image avec CompareMemory()

Programmation d'applications complexes
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

comparaison d'image avec CompareMemory()

Message par Thyphoon »

Pour comparer afin de savoir si deux image sont identique je me suis dit qu'utiliser compareMemory() serait une bonne solution. mais comment connaitre la taille d'une image charger ? est est ce que ImageID() retourne une adresse mémoire ? dans la doc c'est marqué "Renvoie l'identifiant système".
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Pourquoi ne pas faire une comparaison à l'aide du CRC/MD5/SHA1 qui se trouvent dans la lib Cipher de PB ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

oui c'est ce que j'ai finis part conclure ... mais problème comment connaitre l'adresse mémoire et la taille en mémoire d'une image
voici un code que j'ai essayé !

Code : Tout sélectionner

loadimage(2,"image.bmp")
GetObject_(ImageID(2), SizeOf(BITMAP), @bmp.BITMAP)
*buffer.RGBTRIPLE = bmp\bmBits 
size=bmp\bmBits+bmp\bmWidthBytes*bmp\bmHeight-SizeOf(RGBTRIPLE)

With bmp
  Debug \bmWidth
  Debug \bmHeight
  Debug \bmWidthBytes
  Debug \bmBitsPixel
  Debug \bmBits
EndWith 
    
    debug MD5Fingerprint(*buffer, size)
mais ça marche pas ... ou est l'erreur ...

pour info j'ai trouvé l'astuce getObject_ ici http://www.purebasic.fr/english/viewtop ... ge+address

Mais j'aurais aimé me passé des Api mais j'ai l'impression qu'on ne peut pas vraiment faire autrement ! mais bon pour l'instant ça ne marche toujours pas ...
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Tu peux utiliser MD5FileFingerprint(NomFichier$), le problème c'est que ça ne marche que si le fichier est sur ton disque dur.

edit : une piste à explorer pour les images en mémoire, c'est un peu crado mais ça a l'air de passer :

Code : Tout sélectionner

Image = LoadImage(#PB_Any, File$)

GetObject_(ImageID(Image), SizeOf(BITMAP), @bmp.BITMAP)  
*bits = bmp\bmBits

Debug Hex(CRC32Fingerprint(*bits, bmp\bmWidthBytes*bmp\bmHeight))
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

la taille d'une image en ram? pourquoi ne pas faire simple:

Code : Tout sélectionner

ImageWidth(#image)*ImageHeight(#image)*ImageDepth(#image)/8
Ca me parait la solution la moins prise de tête quand même... (peut être pas la plus rapide par contre)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci ça fonctionne voici un code pour tester

Code : Tout sélectionner

Procedure.s GetC32Image(Image.l)
  Protected bmp.BITMAP,*buffer,size.l
  GetObject_(ImageID(Image), SizeOf(BITMAP), @bmp.BITMAP)
  *buffer = bmp\bmBits
  size.l=ImageWidth(Image)*ImageHeight(Image)*ImageDepth(Image)/8 ;La taille selon poshu
  Debug size
  size.l=bmp\bmWidthBytes*bmp\bmHeight ;La taille selon atomo
  Debug size
  ProcedureReturn Hex(CRC32Fingerprint(*buffer, size))
EndProcedure

UsePNGImageDecoder()
UseJPEGImageDecoder()
Repeat
            Filtre$ = "Image (*.png)|*.png;*.jpg|Tous les fichiers (*.*)|*.*"
            Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
            Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
            If Fichier$<>""
              If IsImage(1)
                FreeImage(1)
              EndIf
              LoadImage(1,Fichier$)
              Debug GetC32Image(1)
            EndIf
            
Until Fichier$=""
Merci beaucoup !! :)
Dernière modification par Thyphoon le sam. 15/août/2009 14:36, modifié 1 fois.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Fais un test de perf, je pense que la version atoma est plus rapide.
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve :D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve :D
Oups ! Désolé !! :P
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

grace a vous voilà ce que ça donne
Image
ça decoupe une image en tile, et ça detecte les tiles similaires pour eviter les doublons. ici il a découvert que le Tile 0 se repetait a 3 endroits ! Je posterais le code des que j'aurais finit !!!
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

C'est pas mal pour créer une tileset à partir de rien en effet.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Atomo a écrit :C'est pas mal pour créer une tileset à partir de rien en effet.
c'est le but !! :) ensuite ça te sauvegarde tout les tiles séparement avec le nom nom_coordX-CoordY.ext moi je préfère a l'utilisation de clipsprite avoir tout les sprites séparé !je poste le code des que j'ai le temps de le finir !
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve :D
S'pas ma faute, moi j'avais copié ce que Thyphoon avait écrit; alors je suis même pas désolé, na!
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

poshu a écrit :
Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve :D
S'pas ma faute, moi j'avais copié ce que Thyphoon avait écrit; alors je suis même pas désolé, na!
:lol:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Nouvelle info sur La 4.40 beta1 qui permet de faire un programme cross-platforme
Drawingbuffer support imageoutput donc on peut faire

Code : Tout sélectionner

Procedure.s GetC32Image(Image.l)
  StartDrawing(ImageOutput(Image))
   *buffer=DrawingBuffer()
    size.l=ImageWidth(Image)*ImageHeight(Image)*ImageDepth(Image)/8 ;La taille selon poshu
  finger.s=Hex(CRC32Fingerprint(*buffer, size))
  StopDrawing()
  ProcedureReturn finger
EndProcedure
génial non !!!
Répondre