PureBasic

Forums PureBasic
Nous sommes le Lun 14/Oct/2019 10:04

Heures au format UTC + 1 heure




Poster un nouveau sujet Ce sujet est verrouillé, vous ne pouvez pas éditer de messages ou poster d’autres réponses.  [ 1 message ] 
Auteur Message
 Sujet du message: [LOCKED] J'ai un problème avec un code
MessagePosté: Jeu 26/Juil/2012 20:31 
Hors ligne

Inscription: Mar 24/Juil/2012 23:06
Messages: 19
Citation:
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:
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 !


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Ce sujet est verrouillé, vous ne pouvez pas éditer de messages ou poster d’autres réponses.  [ 1 message ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye