comparaison d'image avec CompareMemory()
comparaison d'image avec CompareMemory()
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".
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é !
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 ...
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)
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 ...
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 :
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))
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)
Code : Tout sélectionner
ImageWidth(#image)*ImageHeight(#image)*ImageDepth(#image)/8
Merci ça fonctionne voici un code pour tester
Merci beaucoup !! 
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$=""

Dernière modification par Thyphoon le sam. 15/août/2009 14:36, modifié 1 fois.
c'est le but !!Atomo a écrit :C'est pas mal pour créer une tileset à partir de rien en effet.

Nouvelle info sur La 4.40 beta1 qui permet de faire un programme cross-platforme
Drawingbuffer support imageoutput donc on peut faire
génial non !!!
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