[LOCKED] J'ai un problème avec un code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Brayan
Messages : 19
Inscription : mar. 24/juil./2012 23:06

[LOCKED] J'ai un problème avec un code

Message par Brayan »

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
Pour l’utiliser, pouvez-vous crée avec par exemple pain ou autre, ce qui vous plaira, crée un carrer de couleur uni, veuillez commencer par le pixel X n°1 et Y n°1 jusqu’à disons 10 et 10, soit 10 X 10.

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 !