Page 1 sur 1

Couleur dominante d'une image et méthode pour foncer une couleur ?

Publié : lun. 09/juin/2025 8:15
par Marc56
Bonjour,

Débutant dans les fonctions de traitement d'image, je me suis fais un petit programme qui centre une image, ajoute un cadre, une bordure et en fait un papier-peint. Tout ça c'est fait, y compris la transformation de images au format .webp (avec un convertisseur externe en attendant un éventuel plugin de lecture)

Actuellement je choisis avec le ColorRequester la couleur de la bordure, mais j'aimerais qu'il puisse choisir tout seul en fonction de la couleur principale.

Questions:
  • Comment calculer la couleur dominante d'une image ? Je pense qu'il faut balayer l'image avec la fonction Point() ? ou y a-t-il plus rapide ?
  • Comment ensuite rendre plus foncée cette couleur ? (ex: si c'est bleu, je veux que le cadre soit bleu 20% plus foncé). Quelles valeurs (RGB?) augmenter à partir d'une couleur définie pour diminuer la luminosité ?
:?: :wink:
(oui un tas de logiciels (ex: irfanview) font ça, mais j'aime bien comprendre le fonctionnement de la roue) :D

Re: Couleur dominante d'une image et méthode pour foncer une couleur ?

Publié : lun. 09/juin/2025 10:12
par SPH
Question 1 : oui, pour ma part, il faudra balayer l'ecran avec un point()
Question 2 : je t'ai fais un code facile a comprendre

Code : Tout sélectionner

R=56
V=12
B=223
Couleur1=RGB(R,V,B)

Foncer_les_couleurs=20 ;(en pourcentage. Ici : 20%)

i=100-Foncer_les_couleurs
R*i/100
V*i/100
B*i/100
Couleur2=RGB(R,V,B)

;;;;;;;;;;;;;;;;;;;

  If OpenWindow(0, 0, 0, 400, 200, "Fonçage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      ; La couleur originale
      Box(0,0,200,200,Couleur1)
      ; La couleur retouchée
      Box(200,0,200,200,Couleur2)   
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf



Re: Couleur dominante d'une image et méthode pour foncer une couleur ?

Publié : lun. 09/juin/2025 14:02
par Marc56
OK, donc pour foncer il suffit de monter chaque canal en %. Merci, c'était si simple. :wink:
Je trouve ça pourtant bizarre, car si on fait descendre le curseur dans le ColorRequester, les valeurs R,V,B ne descendent pas d'une manière proportionnelle (?)

Pour le balayage des pixels, ChatGPT m'avait pondu ça. (en une dizaine de questions / corrections)
Voilà la partie intéressante. Ça fonctionne.

Code : Tout sélectionner

                ; Utiliser Point() pour obtenir la couleur du pixel
                pixelColor = Point(x, y)                
                ; Extraire les composantes RGB
                red   = (pixelColor >> 16) & $FF
                green = (pixelColor >>  8) & $FF
                blue  =  pixelColor        & $FF

Re: Couleur dominante d'une image et méthode pour foncer une couleur ?

Publié : lun. 09/juin/2025 14:25
par SPH
Marc56 a écrit : lun. 09/juin/2025 14:02 OK, donc pour foncer il suffit de monter chaque canal en %.
Non !
Je ne faisais qu'utiliser une technique.

La vrai chose à retenir est que les couleurs primaires vont de 0 a 255.
J'aurais très bien pû te proposer ce code :

Code : Tout sélectionner

R=56
V=12
B=223
Couleur1=RGB(R,V,B)

R*0.8
V*0.8
B*0.8
Couleur2=RGB(R,V,B)

;;;;;;;;;;;;;;;;;;;

  If OpenWindow(0, 0, 0, 400, 200, "Fonçage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      ; La couleur originale
      Box(0,0,200,200,Couleur1)
      ; La couleur retouchée
      Box(200,0,200,200,Couleur2)   
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


Ou encore :

Code : Tout sélectionner

R=56
V=12
B=223
Couleur1=RGB(R,V,B)

R-50
R%256
V-50
V%256
B-50
B%256
Couleur2=RGB(R,V,B)

;;;;;;;;;;;;;;;;;;;

  If OpenWindow(0, 0, 0, 400, 200, "Fonçage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      ; La couleur originale
      Box(0,0,200,200,Couleur1)
      ; La couleur retouchée
      Box(200,0,200,200,Couleur2)   
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf



Re: Couleur dominante d'une image et méthode pour foncer une couleur ?

Publié : lun. 09/juin/2025 16:24
par Marc56
Oui, je connais les couleurs RVB (heureusement)

Voilà ce que j'ai réalisé maintenant (ici juste pour un seul canal)

Code : Tout sélectionner

OpenWindow(0, 0, 0, 220, 250, "", $C80001)
StringGadget(0, 10, 10, 200, 200, "")
SetGadgetColor(0, #PB_Gadget_BackColor, RGB(0, 0, 128))
TrackBarGadget(1, 10, 220, 200, 20, 0, 255)
SetGadgetState(1, 128)

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
        Case #PB_Event_Gadget 
            If EventGadget() = 1 
                SetWindowTitle(0, Str(GetGadgetState(1)))
                SetGadgetColor(0, #PB_Gadget_BackColor, RGB(0, 0, GetGadgetState(1)))
            EndIf  
    EndSelect
ForEver