Créer une image avec toutes les teinte possible

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Créer une image avec toutes les teinte possible

Message par Lord Nelson »

Salut,

Me revoici pour vous faire voir l'un de mes programme, certes il n'as rien d'extraordinaire mais j'en suis content, je l'es fait seule.
Je vous passe tout le blabla mais je l'es commenter un maximum :wink:

Code : Tout sélectionner

; Comment créer un jolie dégradé de couleur avec toutes les teinte possible ?:

; Le Rouge est à fond soit 255.
Rouge = 255

; Le Vert est au minimum soit 0.
Vert = 0

; Le Bleu est au minimum soit 0.
Bleu = 0

X = 0 ; Position en horizontal sur l'image.

CreateImage(1, 1530, 1, 24, 0) ; Création de l'image.
StartDrawing(ImageOutput(1))

; Tu augmente le Vert de 1 en 1 jusqu'à arriver à 255.
For Vert = 0 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 255 car il est égale à 256 en sortie de boucle.
Vert = 255

; Tu diminue le Rouge jusqu'à arriver à 0.
; Ont commance à 254 ou sinon il y aura des doublon.
For Rouge = 254 To 0 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Rouge à 0 car il est égale à -1 en sortie de boucle.
Rouge = 0

; Tu augmente le Bleu de 1 en 1 jusqu'à arriver à 255.
; Ont commance à 1 ou sinon il y aura des doublon.
For Bleu = 1 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Bleu à 255 car il est égale à 256 en sortie de boucle.
Bleu = 255

; Tu diminue le Vert jusqu'à arriver à 0.
; Ont commance à 254 ou sinon il y aura des doublon.
For Vert = 254 To 0 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 0 car il est égale à -1 en sortie de boucle.
Vert = 0

; Tu augmente le Rouge  de 1 en 1 jusqu'à arriver à 255.
; Ont commance à 1 ou sinon il y aura des doublon.
For Rouge = 1 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Rouge à 255 car il est égale à 256 en sortie de boucle.
Rouge = 255

; Tu diminue le Bleu jusqu'à arriver à 0.
; Ont commance à 254 et termine à 1 ou sinon il y aura des doublon.
For Bleu = 254 To 1 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 0 car il est égale à -1 en sortie de boucle.
Bleu = 0

StopDrawing()
; Fin.

SetClipboardImage(1)
Je suppose que l'on peut faire bien plus court mais je fais avec mes moyens :)
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Créer une image avec toutes les teinte possible

Message par Lord Nelson »

Quand j'analyse l'image du haut qui fais 1530 Pixel de largeur et 1 de hauteur, voici se que j’obtiens, voici le code:

Code : Tout sélectionner

Enumeration 1
  #ImageChargement
  #ImageCreation
EndEnumeration

; Minimum entre 2 Valeurs
Procedure.f Min(Val_1.f, Val_2.f, Val_3.f)
  If Val_1 <= Val_2
    Minimum2.f = Val_1
  Else
    Minimum2.f = Val_2
  EndIf
  If Val_3 <= Minimum2.f
    Minimum2.f = Val_3
  EndIf
  ProcedureReturn Minimum2
EndProcedure

; Maximum entre 2 Valeurs
Procedure.f Max(Val_1.f, Val_2.f, Val_3.f)
  If Val_1 <= Val_2
    Maximum2.f = Val_2
  Else
    Maximum2.f = Val_1
  EndIf
  If Val_3 >= Maximum2.f
    Maximum2.f = Val_3
  EndIf
  ProcedureReturn Maximum2
EndProcedure

; Convertie la couleur en Teinte, Saturation et luminosité
Procedure.s RgbToTSL(Couleur.i, NombreDeDecimale.i = 0)
  
  If NombreDeDecimale.i < 0
    NombreDeDecimale.i = 0
  ElseIf NombreDeDecimale.i > 10
    NombreDeDecimale.i = 10
  EndIf
  
  ; By Dobro d'apres:
  ; http://www.la-photo-en-faits.com/2013/05/RVB-CMJN-TSL-conversion-definition.html et http://www.irem.univ-montp2.fr/optionsciences/20052006/nuanciers.pdf
  
  R = Red(Couleur.i)
  V = Green(Couleur.i)
  B = Blue(Couleur.i)
  
  Maxi = Max(R,V,B)
  Mini = Min(R,V,B)
  
  C = (Maxi - mini)
  
  If Maxi = R
    T.f = 60 * (V - B) / C
  EndIf
  
  If Maxi = V
    T.f = 60 * (2 + (B - R) / C)
  EndIf
  
  If Maxi=B
    T.f = 60 * (4 + (B - R) / C)
  EndIf
    
  S.f = 100 * C / Maxi
  L.f = 100 * Maxi / 255
  
  If T.f <= 0
    T.f = 0
  EndIf
  
  If L.f <= 0
    L.f = 0
  EndIf
  
  If S.f <= 0
    S.f=0
  EndIf
  
;   Debug "T.f = " + T.f
;   Debug "S.f = " + S.f
;   Debug "L.f = " + L.f
;   Debug ""
  
  Sortie.s = StrF(T, NombreDeDecimale.i) + "," + StrF(S, NombreDeDecimale.i) + "," + StrF(L, NombreDeDecimale.i) + "," + Str(R) + "," + Str(V) + "," + Str(B)
  ProcedureReturn Sortie.s
  
EndProcedure

; Procedure de chargement d'une image
Procedure.l ChargementImage(NumeroImage, FiltreDefaut)
  
  Chargement_Image:
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpg)|*.Jpg|Image Tga (*.Tga)|*.Tga|Image Tiff (*.Tiff)|*.Tiff"
  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()
      
    ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".tga", 1)
      UseTGAImageDecoder()
      
    ElseIf FindString(LCase(GetFilePart(FichierImage$)), ".tiff", 1)
      UseTIFFImageDecoder()
      
    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

; Procedure pour lire une image
Procedure LireImage()
  
  If ChargementImage(#ImageChargement, 1)
    
    If CreateImage(#ImageCreation, 1530, 2000, 24, 0)
      
    EndIf
    
    X = 0
    Y = 0
    
    LargeurImage = ImageWidth(#ImageChargement)
    HauteurImage = ImageHeight(#ImageChargement)
    
    StartDrawing(ImageOutput(#ImageChargement))
    
    Repeat
            
      If X = LargeurImage
        Break
      EndIf
      
      Couleur.i = Point(X, 0)
      TSL.s = RgbToTSL(Couleur.i, 20)

      Debug "Couleur = " + Str(Couleur) + " - Rouge = " + StringField(TSL.s, 4, ",") + ", Vert = " + StringField(TSL.s, 5, ",") + ", Bleu = " + StringField(TSL.s, 6, ",") + " - Teinte = " + StringField(TSL.s, 1, ",") + "°" + ", Saturation = " + StringField(TSL.s, 2, ",") + "%" + ", luminosité = " + StringField(TSL.s, 3, ",") + "%"
      
      X + 1
      
    ForEver
    
    StopDrawing()
    
  Else
    MessageRequester("Erreur", "Image non initialiser !", 64)
  EndIf
  
EndProcedure

LireImage()

Dobro, ta procédure est t-elle exacte car les résultats sont du moins surprenant surtout vers la fin ?
De plus il existe bien un nombre de 1530 teinte preuve à l’appuie non ?
Répondre