Dayvid, tu es lourd
Bonsoir,
Je me permets de poster parce que je ne parviens pas à comprendre quelque chose !
Voilà, en bref, se code permet pour commencer car ce n’est qu’une ébauche, de savoir le nombre de couleurs dans l’image et leurs fréquence d’utilisation, voilà en gros.
Pardonnez-moi pour se long code :
Code : Tout sélectionner
Enumeration 1
#Image
EndEnumeration
PixelMax.q = 16777216
Global FichierImage$ = ""
Global NewMap PaletteCouleur.q(PixelMax.q)
Global NewList PaletteCouleurTrier.q()
Global NewList CouleurPixelImage.q()
Global NewList CouleurPaletteCompresser.q()
Global Dim CouleursResensement.q(1, 0)
; Procedure de chargement d'une image
Procedure.q ChargementImage(NumeroImage, FiltreDefaut)
Chargement_Image:
Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpeg)|*.Jpeg"
FichierImage$ = OpenFileRequester("Choisissez un fichier à charger", GetHomeDirectory() + "Bureau\", Filtre$, FiltreDefaut)
If FichierImage$
If FindString(LCase(GetFilePart(FichierImage$)), ".bmp", 1)
; Ok
ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".png", 1)
UsePNGImageDecoder()
ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".jpeg", 1)
UseJPEGImageDecoder()
Else
MessageRequester("Fichier invalide !", " Veuillez choisir un fichier d'image invalide !", 48)
ProcedureReturn 0
EndIf
If LoadImage(NumeroImage, FichierImage$) <> 0
ProcedureReturn LoadImage(NumeroImage, FichierImage$)
Else
MessageRequester("Erreur de chargement !", " Impossible de charger le fichier " + Chr(34) + GetFilePart(FichierImage$) + Chr(34) + " !", 16)
ProcedureReturn 0
EndIf
EndIf
ProcedureReturn 0
EndProcedure
; Procédure permetant de savoir la place qu'utilise le nombre en octets
; Ascii = 1 octets, Unicode = 2 octets, Long = 4 octets, Quad = 8 octets
Procedure.b TypeNombre(Nombre.q)
If Nombre = 0 Or Nombre <= 255
ProcedureReturn 1
ElseIf Nombre => 256 And Nombre <= 65535
ProcedureReturn 2
ElseIf Nombre => 65536 And Nombre <= 2147483647
ProcedureReturn 4
ElseIf Nombre => 2147483648 And Nombre <= 9223372036854775807
ProcedureReturn 8
EndIf
EndProcedure
; Procedure pour indexer les couleurs pour crée une palette de couleurs
Procedure IndexationPixel(Couleur)
PaletteCouleur.q(Str(Couleur)) = Couleur
EndProcedure
; Procedure pour trier la palette de couleurs indexer précédement
Procedure.q TrierPaletteCouleurs()
NombreCouleurs = 0
ResetMap(PaletteCouleur.q())
While NextMapElement(PaletteCouleur.q())
NombreCouleurs + 1
AddElement(PaletteCouleurTrier.q())
PaletteCouleurTrier.q() = PaletteCouleur.q()
Wend
SortList(PaletteCouleurTrier.q(), #PB_Sort_Ascending)
ProcedureReturn NombreCouleurs
EndProcedure
; Procedure pour enregistrer la couleur du pixel lue actuellement
Procedure EnregistrerPixel(Couleur)
AddElement(CouleurPixelImage.q())
CouleurPixelImage.q() = Couleur
EndProcedure
; Procedure pour réduire les informations de la palette de couleur en calculent la différence qu'il y a entre les nombres dans l'ordre du plus petit au plus grand
; (entre le premier et le deuxième, le deuxième et le troisième, le troisième et le quatrième et ainsi de suite !)
Procedure CreationPaletteCompresser()
ForEach PaletteCouleurTrier.q()
If ListIndex(PaletteCouleurTrier.q()) = 0
AddElement(CouleurPaletteCompresser.q())
CouleurPaletteCompresser.q() = PaletteCouleurTrier.q()
EndIf
PremierNombre.q = PaletteCouleurTrier.q()
If NextElement(PaletteCouleurTrier.q())
SecondNombre.q = PaletteCouleurTrier.q()
AddElement(CouleurPaletteCompresser.q())
CouleurPaletteCompresser.q() = SecondNombre.q - PremierNombre.q
PreviousElement(PaletteCouleurTrier.q())
Else
Break
EndIf
Next PaletteCouleurTrier.q()
EndProcedure
; Procedure d'oppération sur le pixel lue actuellement
Procedure OpperationPixel(Couleur)
Static NombreLigne
Static Modification
For i = 0 To NombreLigne
If CouleursResensement.q(0, i) = Couleur
CouleurTableau.q = CouleursResensement.q(0, i)
NombreCouleurTableau.q = CouleursResensement.q(1, i)
CouleursResensement.q(1, i) = NombreCouleurTableau.q + 1
Trouver = 1
Break
Else
Trouver = 0
EndIf
Next
If NombreLigne > 0
If Modification = 0
If Trouver = 0
NombreLigne + 1
ReDim CouleursResensement.q(1, NombreLigne)
CouleursResensement.q(0, NombreLigne) = Couleur
CouleursResensement.q(1, NombreLigne) = 1
EndIf
Else
CouleursResensement.q(0, NombreLigne) = Couleur
CouleursResensement.q(1, NombreLigne) = 1
Modification = 0
EndIf
Else
NombreLigne + 1
Modification = 1
CouleursResensement.q(0, 0) = Couleur
CouleursResensement.q(1, 0) = 1
ReDim CouleursResensement.q(1, NombreLigne)
EndIf
EndProcedure
; Procedure qui permet de savoir combien de fois au totale chaque couleur a été utiliser dans l'image
Procedure ResensementCouleurs()
NombreLigne = ArraySize(CouleursResensement(), 2)
For i = 0 To NombreLigne
CouleurTableau = CouleursResensement(0, i)
NombreCouleurTableau = CouleursResensement(1, i)
Rouge = Red(CouleurTableau)
Vert = Green(CouleurTableau)
Bleu = Blue(CouleurTableau)
Alpha = Alpha(CouleurTableau)
Debug "RGB(" + Str(Rouge) + ", " + Str(Vert) + ", " + Str(Bleu) + ", " + Str(Alpha) + ") a été utiliser " + Str(NombreCouleurTableau) + " Fois" + Chr(13) + Chr(10)
Next
EndProcedure
; Procedure pour lire l'image
Procedure LireImage()
If ChargementImage(#Image, 1)
X = 0
Y = 0
Largeur = ImageWidth(#Image)
Hauteur = ImageHeight(#Image)
Profondeur = ImageDepth(#Image)
StartDrawing(ImageOutput(#Image))
Repeat
Couleur = Point(X, Y)
IndexationPixel(Couleur)
If X <> Largeur - 1
X + 1
Else
X = 0
Y + 1
EndIf
EnregistrerPixel(Couleur)
OpperationPixel(Couleur)
Until X = Largeur - 1 And Y = Hauteur - 1
Couleur = Point(X, Y)
IndexationPixel(Couleur)
EnregistrerPixel(Couleur)
OpperationPixel(Couleur)
Debug "Il y a au totale " + Str(TrierPaletteCouleurs()) + " couleurs dans l'image:"
StopDrawing()
EndIf
EndProcedure
LireImage()
CreationPaletteCompresser()
ResensementCouleurs()
; FirstElement(CouleurPaletteCompresser.q())
;
; ForEach PaletteCouleurTrier.q()
;
; PremierNombre.q = PaletteCouleurTrier.q()
;
; If NextElement(PaletteCouleurTrier.q())
; CouleurNumero + 1
; NextElement(CouleurPaletteCompresser.q())
; SecondNombre.q = PaletteCouleurTrier.q()
; Debug "Premier nombre = " + Str(PremierNombre.q) + ", Second nombre = " + Str(SecondNombre.q) + ", " + "Différence entre les deux = " + Str(CouleurPaletteCompresser.q()) + " (" + Str(SecondNombre.q) + " - " + Str(PremierNombre.q) + " = " + Str(SecondNombre.q - PremierNombre.q) + ")"
; PreviousElement(PaletteCouleurTrier.q())
; Else
; Break
; EndIf
;
; Next
Enregistrer votre image et ouvrez-là avec mon code.
Bon après, le logiciel va vous dire le nombre de couleur que contient votre image puis ensuite, il va énumérer la fréquence d’utilisation de chaque couleur de celle-ci.
Le problème est que la deuxième ligne dans le débuguer est fausse car il dit que :
RGB(Couleur) a été utilisé 1 Fois
Et je ne comprends pas pourquoi il fait ça !
Ça doit pas être très compliquer et même surement très bête mais je n’arrive pas a comprendre pourquoi il fait ça !
Excusez-moi pour se long message et merci d’avance pour votre précieuse aide !