Page 1 sur 2

Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 14:41
par Shadow
Salut,

J'aimerais savoir comment ont fait pour changer la Teinte Globale d'une image, je sais pas si je suis clair donc voilà se que je veux faire avec PB:
http://www.aht.li/3060923/bandicam_2017 ... 46-144.avi

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 15:24
par Ar-S
Tout dépend de comment tu crées et comment tu affiches ton image..
Si tu veux de la modif en temps réel comme sur ta video, je te conseils de faire 3 TrackBarGadget()
Une pour le R une pour le G une pour le B... Que tu initialises de 0 à 255
Quand tu bouges un des curseurs tu modifies l'affichage de ton bouton en directe..

Il y a surement plein d'exemples sur le forum.

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 15:27
par Shadow
Salut,

Je ne veux pas faire un logiciel, je veux une procédure qui change les couleurs :)
Merci quand même.

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 15:37
par Ar-S
Sérieux... Tu peux pas être moins précis?
Tout dépend de comment tu comptes colorer tes boutons...
Si tu les dessines dans un canvas ou pas, dans un screen ? etc...
Dans TOUS les cas tu changes les valeurs RGB... Je vois pas le soucis.

Exemple à l'arrache pour modifier la valeur du rouge..

Code : Tout sélectionner


Enumeration GUI
  #LDVM
  #CANVAS
  #T_RED
EndEnumeration

Lwin = 350 : Hwin = 100
Global Canvas_MAX_L = Lwin - 101
Global Canvas_MAX_H = Hwin

; ********************* PROGRAMME ********************** 


hwnd = OpenWindow(#LDVM, #PB_Any, #PB_Any, Lwin, Hwin, "by Ar-S // 2017", #PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)

CanvasGadget(#CANVAS, 101, 1,  Canvas_MAX_L, Canvas_MAX_H , #PB_Canvas_DrawFocus|#PB_Canvas_ClipMouse)
StartDrawing(CanvasOutput(#CANVAS))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0, Canvas_MAX_L, Canvas_MAX_H, $FFFFFF)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(5,5, "Vide", $0)
StopDrawing()


TrackBarGadget(#T_RED, 1, 20, 100, 25, 0, 255) ;
; Position trackBar Couleurs
SetGadgetState(#T_RED, 200) ; on initialise à 200 le rouge

; initialisation du 1er affichage
RED_VAL.i = GetGadgetState(#T_RED)
StartDrawing(CanvasOutput(#CANVAS))
Box(0,0,Canvas_MAX_L,Canvas_MAX_H,$0)
DrawText(5,5, "VARIANTE ROUGE", RGB(RED_VAL,0,0) )
StopDrawing()

; ************ EVENT et BOUCLE ********************** 

Repeat
  
  Select WaitWindowEvent()
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
       
        Case #T_RED ;- SI on bouge la trackbar, on change la variante rouge
          RED_VAL.i = GetGadgetState(#T_RED)
          StartDrawing(CanvasOutput(#CANVAS))
          Box(0,0,Canvas_MAX_L,Canvas_MAX_H,$0)
          DrawText(5,5, "VARIANTE ROUGE", RGB(RED_VAL,0,0) )
          StopDrawing()
          
      EndSelect            
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #LDVM
          quite=1
      EndSelect
      
      
  EndSelect
  
  
Until quite=1







Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 16:14
par falsam

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 16:14
par Shadow
Merci Ar'S,

Oui, sur une image :)

Merci Falsam.

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 17:17
par falsam
Il y a des choses interessantes dans ce post de BasicallyPure sur le forum anglophone.

:arrow: http://forum.purebasic.com/english/view ... 2a#p482309

J'ai pris une partie de son code pour teinter une image.

■ Objectif.
- Choisir une image.
- Sélectionner la couleur de teinture.
- Teinter l'image.
- Afficher le résultat.

Code : Tout sélectionner

EnableExplicit

;Plan de l'application
Declare Start()
Declare TintImage(Image, Color)
Declare Exit()

Start()

Procedure Start()
  Protected FileName.s, Image, Color = RGB(169, 169, 169)
  
  UseJPEGImageDecoder()
  UsePNGImageDecoder()
  
  OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(0, 0, 0, 800, 600, 0)  
  
  ;Choisir une image 
  FileName = OpenFileRequester("Choisir une image", "", "", 0)
  
  If FileName
    Image = LoadImage(-1, FileName)
    
    If image
      ;Choisir la couleur de teinte
      Color = ColorRequester()
    EndIf
    
    TintImage(Image, Color)
    SetGadgetState(0, ImageID(Image))
  EndIf   
  
  ;Triggers
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure TintImage(Image, Color)
  Protected c, i, x, y, width, height
  Protected.d r, g, b
  
  r = Red(color)   / 1785
  g = Green(color) / 1785
  b = Blue(color)  / 1785
  
  If IsImage(Image)
    
    StartDrawing(ImageOutput(Image))
    width = OutputWidth()  - 1
    height = OutputHeight() - 1
    
    For y = 0 To height
      For x = 0 To width
        c = Point(x, y)
        
        i = (c & $FF) << 1 : c >> 8
        i + (C & $FF) << 2 : c >> 8
        i + (c & $FF)      : c >> 8
        
        Plot(x, y, RGBA(r*i, g*i, b*i, c))
      Next x
    Next y
    StopDrawing()
  EndIf 
EndProcedure

Procedure Exit()  
  End
EndProcedure
C'est pas mal :wink:

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 17:37
par Shadow
Ah oui pas mal du tout même !
Merci Falsam :)

Re: [Résolu] Comment changer la Teinte Globale d'une image..

Publié : lun. 01/mai/2017 17:45
par Shadow
Hum, en faite ça ne me conviens pas :?
Je voudrait comme sur ma vidéo...

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 18:13
par Ar-S
Comme d'habitude tu captures les pixels dans un tableau et tu modifier leur couleur..
Tu as tout ce qu'il te faut sur le forum même des sujets où tu étais présent. Procédure tabpixel ou un truc comme ça que j'ai posté plusieurs fois.

Re: [Résolu] Comment changer la Teinte Globale d'une image..

Publié : lun. 01/mai/2017 19:12
par falsam
Shadow a écrit :Hum, en faite ça ne me conviens pas :?
Je voudrait comme sur ma vidéo...
mais quel raleur celui là. En fait tu veux une solution clé en main :mrgreen:

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 19:31
par falsam
Et bien voila une solution qui ne demande qu'à être fignoler.

Code : Tout sélectionner

EnableExplicit

Global Image

;Plan de l'application
Declare Start()
Declare CButton(w, h, text.s, BackColor, Color)
Declare OnChange()
Declare ColorTint(Color, Scale.f) 
Declare Exit()

Start()

Procedure Start()  
  OpenWindow(0, 0, 0, 800, 600, "Création d'un bouton", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  FrameGadget(-1, 20, 20, 380, 200, "Avant") 
  ImageGadget(0, 40, 40, 0, 0, 0)
  
  FrameGadget(-1, 405, 20, 380, 200, "Aprés") 
  ImageGadget(1, 425, 40, 0, 0, 0)
  
  TrackBarGadget(2, 196, 250, 400, 26, 0, 200)
  SetGadgetState(2, 100)
  TextGadget(3, 196, 280, 400, 22, "", #PB_Text_Center)
  
  ;Triggers
  BindGadgetEvent(2, @OnChange())
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Image = CButton(120, 30, "Mon button", RGB(255, 215, 0), RGB(255, 255, 255))
  SetGadgetState(0, ImageID(Image))
  OnChange()
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

;Création d'un bouton
Procedure CButton(w, h, text.s, BackColor, Color)
  Protected tw, th
  Protected Image = CreateImage(-1, w, h, 32, RGB(169, 169, 169))
  
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_Gradient)
    FrontColor(Color)
    BackColor(BackColor)
    LinearGradient(w/2, 0, w/2, h)
    RoundBox(0, 0, w, h, 4, 4)
  
    DrawingMode(#PB_2DDrawing_Outlined)
    RoundBox(0, 0, w, h, 4, 4, RGB(0, 0, 0))
    DrawingMode(#PB_2DDrawing_Transparent)
    tw = TextWidth(text)
    th = TextHeight(text)
    If tw < w And th < h
      DrawText((w-tw)/2, (h-th)/2, text, RGB(255, 0, 0))
    EndIf
  StopDrawing()
  ProcedureReturn Image  
EndProcedure

;La valeur du trackbar a changé
Procedure OnChange()
  Protected Scale.f = GetGadgetState(2)/100 - 1
  Protected c, x, y, width, height
  Protected ImageResult
  
  SetGadgetText(3, StrF(Scale))
  
  CopyImage(Image, ImageResult)
  
  StartDrawing(ImageOutput(ImageResult))
  width = OutputWidth()  - 1
  height = OutputHeight() - 1
  
  For y = 0 To height
    For x = 0 To width
      c = Point(x, y)
      ColorTint(c, Scale)        
      Plot(x, y, ColorTint(c, Scale))
    Next x
  Next y
  StopDrawing()
  
  SetGadgetState(1, ImageID(ImageResult))
EndProcedure

; Changer la teinte d'une couleur (Echelle comprise entre -1 et 1)
Procedure ColorTint(Color, Scale.f) 
  Protected Red, Green, Blue
  
  Red = Red(Color)
  Green = Green(Color)
  Blue = Blue(Color)
  
  If Scale > 0
    Red = Red * (1 - Scale) + Blue * Scale
    Green = Green * (1 - Scale) + Red * Scale
    Blue = Blue * (1 - Scale) + Green * Scale
  Else
    Red = Red * (1 + Scale) - Green * Scale
    Green = Green * (1 + Scale) - Blue * Scale
    Blue = Blue * (1 + Scale) - Red * Scale
  EndIf
   
  ProcedureReturn RGB(Red, Green, Blue) 
EndProcedure

Procedure Exit()  
  End
EndProcedure

Re: Comment changer la Teinte Globale d'une image...

Publié : lun. 01/mai/2017 21:22
par Shadow
Jolie Falsam, merci ! :D
Par contre les couleurs s’assombrisse c'est normale ?

Re: Comment changer la Teinte Globale d'une image...

Publié : mar. 02/mai/2017 11:02
par Guillot
salut,

ma contribution :
j'ai fais quelques fonction de gestion des couleurs
en ce qui te concerne, sur la droite y'a 3 petits avions coloré de différentes manieres : blend, add, sub (il manque l’addition signée)

note :en déplaçant le scrollbar vertical a droite tu change la composante teinte

Code : Tout sélectionner

Procedure limite(v,min=0,max=255)
  If v<min:v=min:EndIf
  If v>max:v=max:EndIf
  ProcedureReturn v
EndProcedure

Global Dim l255.a(256*3-1):For i=0 To 255:l255(i+256)=i:l255(i+512)=255:Next

Procedure ColorBlend(color1.l, color2.l, blend.f=0.5)
  Protected r.w,g.w,b.w,a.w
  r=  Red(color1) + (Red(color2)     - Red(color1)) * blend
  g=Green(color1) + (Green(color2) - Green(color1)) * blend
  b= Blue(color1) + (Blue(color2) -   Blue(color1)) * blend
  a=Alpha(color1) + (Alpha(color2) - Alpha(color1)) * blend
  ProcedureReturn  RGBA(r,g,b,a)
EndProcedure

Procedure ColorAdd(color1.l, color2.l, blend.f=1)
  Protected r.w,g.w,b.w,a.w
  r=  Red(color1) +   Red(color1) * blend
  g=Green(color1) + Green(color1) * blend
  b= Blue(color1) +  Blue(color1) * blend
  a=Alpha(color1) + Alpha(color1) * blend
  ProcedureReturn  RGBA(l255(r+256),l255(g+256),l255(b+256),l255(a+256))
EndProcedure

Procedure ColorSub(color1.l, color2.l, blend.f=1)
  Protected r.w,g.w,b.w,a.w
  r=  Red(color1) -   Red(color1) * blend
  g=Green(color1) - Green(color1) * blend
  b= Blue(color1) -  Blue(color1) * blend
  a=Alpha(color1) - Alpha(color1) * blend
  ProcedureReturn  RGBA(l255(r+256),l255(g+256),l255(b+256),l255(a+256))
EndProcedure


Procedure DrawingFilter_add(X, Y, cs.l, cd.l)
  ProcedureReturn RGBA(l255(Red(cd)+Red(cs)+256),l255(Green(cd)+Green(cs)+256),l255(Blue(cd)+Blue(cs)+256),l255(Alpha(cd)+Alpha(cs)+256))
  ;ProcedureReturn RGBA(limite(Red(cd)+Red(cs)),limite(Green(cd)+Green(cs)),limite(Blue(cd)+Blue(cs)),limite(Alpha(cd)+Alpha(cs)))
EndProcedure

Procedure DrawingFilter_sub(X, Y, cs, cd)
  ProcedureReturn RGBA(l255(Red(cd)-Red(cs)+256),l255(Green(cd)-Green(cs)+256),l255(Blue(cd)-Blue(cs)+256),l255(Alpha(cd)-Alpha(cs)+256))
  ;ProcedureReturn RGBA(limite(Red(cd)-Red(cs)),limite(Green(cd)-Green(cs)),limite(Blue(cd)-Blue(cs)),limite(Alpha(cd)-Alpha(cs)))
EndProcedure

Procedure.l HSLToRGB(hue.a, saturation.a, lightness.a, alpha=0)
  Protected.f h=hue *6/256
  Protected.f s=saturation/255
  Protected.f l=lightness/255
  Protected.f c,x,r_,v_,b_,m
  c=(1-Abs(2*l-1))*s
  x=c*(1-Abs(Mod(h, 2) -1))
  Select Int(h)
    Case 0:r_=c:v_=x
    Case 1:r_=x:v_=c
    Case 2:v_=c:b_=x
    Case 3:v_=x:b_=c
    Case 4:r_=x:b_=c
    Case 5:r_=c:b_=x
  EndSelect
  m=l-c/2
  Protected r,v,b
  r=Int((r_+m)*255)
  v=Int((v_+m)*255)
  b=Int((b_+m)*255)
  ProcedureReturn RGBA(r,v,b,alpha)
EndProcedure

Procedure.l RGBToHSL(red.a, green.a, blue.a, alpha=0)
  Protected.f r=red/255
  Protected.f g=green/255
  Protected.f b=blue/255
  Protected.f cmax, cmin, h_,c,m,h,s,l
  Protected.l imax,imin
  If r>=g And r>=b:imax=1:cmax=r:EndIf
  If g>=r And g>=b:imax=2:cmax=g:EndIf
  If b>=r And b>=g:imax=3:cmax=b:EndIf
  If r<=g And r<=b:imin=1:cmin=r:EndIf
  If g<=r And g<=b:imin=2:cmin=g:EndIf
  If b<=r And b<=g:imin=3:cmin=b:EndIf
  c=cmax-cmin
  Select imax
    Case 1:h_=Mod((g-b)/c+6,6)
    Case 2:h_=(b-r)/c+2
    Case 3:h_=(r-g)/c+4
  EndSelect
  h=h_/6
  l=(cmax+cmin)/2
  If l<>1:s=c/(1-Abs(2*l-1)):Else:s=0:EndIf
  ProcedureReturn RGBA(h*255,s*255,l *255,alpha)  
EndProcedure

; ==================================== exemple ====================================

Procedure affiche_exemple()
  StartDrawing(CanvasOutput(0))
  
  ;--------------------- palette HSL
  Box(0, 0, 512, 512, $888888)
  For j=0 To 255
    For i = 0 To 255
      Plot(i,j, HSLToRGB(i,j,128))
    Next
  Next
  
  ;--------------------- spheres
  DrawingMode(#PB_2DDrawing_Gradient)
  Macro sphere
    ResetGradientColors()
    GradientColor(0.0,HSLToRGB(h,64,200))
    GradientColor(0.3,HSLToRGB(h,64,128))
    GradientColor(1.0,HSLToRGB(h,64,64))
    CircularGradient(x-r*0.3, y+r*1.2+r*0.5,r)    
    Circle(x,y+r*1.2,r)
    
    ResetGradientColors()
    GradientColor(0.0,HSLToRGB(h,255,255))
    GradientColor(0.3,HSLToRGB(h,255,128))
    GradientColor(1.0,HSLToRGB(h,255,64))
    CircularGradient(x-r*0.3, y-r*0.3,r)    
    Circle(x,y,r)
  EndMacro
  
  For j=1 To 4
    n=1<<j
    For i=0 To n-1
      h=(0.5+i)/n*256
      r=50/Sqr(n)
      r=120/n
      x=256+h
      y=16*(i & 1)+330-420/Sqr(n)
      sphere
    Next
  Next
  
  ;--------------------- filtres blend, add, sub
  
  DrawImage(ImageID(0), 0, 256, 512, 256)
  
  For j=0 To 2
    Select j
      Case 0:dm.s="Blend":DrawingMode(#PB_2DDrawing_Gradient |#PB_2DDrawing_AlphaBlend)
      Case 1:dm.s="Add"  :DrawingMode(#PB_2DDrawing_Gradient |#PB_2DDrawing_CustomFilter):CustomFilterCallback(@ DrawingFilter_add())
      Case 2:dm.s="Sub"  :DrawingMode(#PB_2DDrawing_Gradient |#PB_2DDrawing_CustomFilter):CustomFilterCallback(@ DrawingFilter_sub())
    EndSelect
    For i=0 To 2
      x=64+(512-128)*j/2 
      y=64+256+64*i
      ResetGradientColors()
      GradientColor(0,$ff000000 |$88<<(i*8))
      GradientColor(1,$ff000000)
      CircularGradient(x,y,64)
      Circle(x,y,64)        
    Next
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(x,256,dm)
  Next
  StopDrawing() 
EndProcedure

Procedure affiche_geebee()
  hue=GetGadgetState(1)
  StartDrawing(CanvasOutput(0))
  For i=0 To 2
    DrawingMode(#PB_2DDrawing_Default )
    DrawImage(ImageID(1),512,i*128)
    Select i
      Case 0:dm.s="Blend":DrawingMode(#PB_2DDrawing_AlphaBlend)
      Case 1:dm.s="Add"  :DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@ DrawingFilter_add())
      Case 2:dm.s="Sub"  :DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@ DrawingFilter_sub())
    EndSelect
    Box(512,i*128,128,128,HSLToRGB(hue,255,127,127))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(512,i*128,dm)
  Next
  StopDrawing()
EndProcedure

OpenWindow(0, 0, 0, 512+128+16, 512, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 512+128, 512)
ScrollBarGadget(1,512+128,0,16,512,0,255,1,#PB_ScrollBar_Vertical)
BindGadgetEvent(1,@ affiche_geebee())
UseJPEGImageDecoder()
LoadImage(0, #PB_Compiler_Home + "Examples/3D/Data/Textures/dirt.jpg")
LoadImage(1, #PB_Compiler_Home + "Examples/3D/Data/Textures/geebee2.bmp")

affiche_exemple()
affiche_geebee()

Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow


Re: Comment changer la Teinte Globale d'une image...

Publié : mar. 02/mai/2017 11:39
par Shadow
Merci beaucoup Guillot :)