Page 1 sur 1
comparaison d'image avec CompareMemory()
Publié : ven. 14/août/2009 17:24
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".
Publié : ven. 14/août/2009 17:31
par Atomo
Pourquoi ne pas faire une comparaison à l'aide du CRC/MD5/SHA1 qui se trouvent dans la lib Cipher de PB ?
Publié : ven. 14/août/2009 18:13
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 ...
Publié : ven. 14/août/2009 19:51
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))
Publié : sam. 15/août/2009 1:12
par poshu
la taille d'une image en ram? pourquoi ne pas faire simple:
Ca me parait la solution la moins prise de tête quand même... (peut être pas la plus rapide par contre)
Publié : sam. 15/août/2009 8:55
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 !!

Publié : sam. 15/août/2009 13:41
par poshu
Fais un test de perf, je pense que la version atoma est plus rapide.
Publié : sam. 15/août/2009 13:52
par Atomo
C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve

Publié : sam. 15/août/2009 14:38
par Thyphoon
Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve

Oups ! Désolé !!

Publié : sam. 15/août/2009 14:50
par Thyphoon
grace a vous voilà ce que ça donne

ç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 !!!
Publié : sam. 15/août/2009 15:15
par Atomo
C'est pas mal pour créer une tileset à partir de rien en effet.
Publié : sam. 15/août/2009 18:50
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 !
Publié : sam. 15/août/2009 20:00
par poshu
Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve

S'pas ma faute, moi j'avais copié ce que Thyphoon avait écrit; alors je suis même pas désolé, na!
Publié : sam. 15/août/2009 20:52
par Thyphoon
poshu a écrit :Atomo a écrit :C'est Atom>>O<< (Atomo) les gars mais c'est pas grâve

S'pas ma faute, moi j'avais copié ce que Thyphoon avait écrit; alors je suis même pas désolé, na!

Publié : dim. 16/août/2009 7:21
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 !!!