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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

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

Message 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



!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

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

Message 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



!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

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

Message 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
Répondre