Page 1 sur 1

2DDrawing Transparence en direct

Publié : mer. 01/janv./2020 18:44
par Ekim
Bonsoirs la communauté :D

Quelqu'un peut il m'expliquer pourquoi ce morceaux de code ne fonctionne pas?, j’essaie de faire varier la transparence d'un box sur une image quelconque!

Code : Tout sélectionner

UseJPEGImageDecoder()
UsePNGImageDecoder()

Global Window_1

Global Image_0, TrackBar_0, Button_0, string_0

CreateImage(1,440,290,32,$0000FF)


Procedure OpenWindow_1(x = 0, y = 0, width = 600, height = 400)
	Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	Image_0 = ImageGadget(#PB_Any, 70, 50, 440, 290, 0, #PB_Image_Border)
	TrackBar_0 = TrackBarGadget(#PB_Any, 40, 350, 520, 20, 0, 255)
	string_0 = TextGadget(#PB_Any,560,350,30,20,"255")
	SetGadgetState(TrackBar_0,255)
	Button_0 = ButtonGadget(#PB_Any, 10, 10, 40, 30, "Image")
	
EndProcedure


Procedure Window_1_Events(event)
	Select event
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case Button_0
					
					pic$ = OpenFileRequester("Image indexe",pic$,"",0)
					
					If LoadImage(0,pic$)
						ResizeImage(0,440,290,#PB_Image_Smooth)
						
						SetGadgetState(Image_0,ImageID(0))
					Else
						Debug "Erreur de chargement"
					EndIf
			EndSelect
			
		Case #PB_Event_Timer
			If EventTimer() = 1
				If IsImage(0)
					trs=GetGadgetState(TrackBar_0)
					SetGadgetText(string_0,Str(trs))
					
					StartDrawing(ImageOutput(0))
						DrawingMode(#PB_2DDrawing_Transparent)
						DrawAlphaImage(ImageID(1),0,0,trs)
						;Box(0,0,440,290,RGBA(255,0,0,))
					StopDrawing()
					
					SetGadgetState(Image_0,ImageID(0))
				EndIf
			EndIf
		
	EndSelect
	
	ProcedureReturn #True
EndProcedure

OpenWindow_1(Window_1,0,600,400)

AddWindowTimer(Window_1,1,125)

Repeat
	Event = WaitWindowEvent()
	
	Window_1_Events(Event)
	
Until Event = #PB_Event_CloseWindow

End
je n'y arrive vraiment pas à trouver la solution!

merci d'avance)

et bonne année 2020)

Re: 2DDrawing Transparence en direct

Publié : mer. 01/janv./2020 21:39
par case
le problème c'est que si tu redessine a chaque fois ton rectangle rouge sur ton image d'origine elle disparait

Code : Tout sélectionner

UseJPEGImageDecoder()
UsePNGImageDecoder()
Global Window_1

Global Image_0, TrackBar_0, Button_0, string_0

CreateImage(1,440,290,32,$0000FF)


Procedure OpenWindow_1(x = 0, y = 0, width = 600, height = 400)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  Image_0 = ImageGadget(#PB_Any, 70, 50, 440, 290, 0, #PB_Image_Border)
  TrackBar_0 = TrackBarGadget(#PB_Any, 40, 350, 520, 20, 0, 255)
  string_0 = TextGadget(#PB_Any,560,350,30,20,"255")
  SetGadgetState(TrackBar_0,5)
  Button_0 = ButtonGadget(#PB_Any, 10, 10, 40, 30, "Image")
EndProcedure


Procedure Window_1_Events(event)
  Static image2                            ; utilisé pour la copie de l'image d'origine
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_0
          pic$ = OpenFileRequester("Image indexe",pic$,"",0)
          If LoadImage(0,pic$)
            ResizeImage(0,440,290,#PB_Image_Smooth)
            image2=CopyImage(0,#PB_Any)   ; crée une copie de l'image d'origine            
            SetGadgetState(Image_0,ImageID(0))
          Else
            Debug "Erreur de chargement"
          EndIf
      EndSelect
      
    Case #PB_Event_Timer
      If EventTimer() = 1
        If IsImage(0)
          trs=GetGadgetState(TrackBar_0)
          SetGadgetText(string_0,Str(trs))
          StartDrawing(ImageOutput(0))         
          DrawImage(ImageID(image2),0,0)        ; dessine la copie de l'image d'origine          
          DrawAlphaImage(ImageID(1),0,0,trs)    ; dessine l'image alpha
          StopDrawing()
          SetGadgetState(Image_0,ImageID(0))
        EndIf
      EndIf
      
  EndSelect
  
  ProcedureReturn #True
EndProcedure

OpenWindow_1(Window_1,0,600,400)

AddWindowTimer(Window_1,1,125)

Repeat
  Event = WaitWindowEvent()
  
  Window_1_Events(Event)
  
Until Event = #PB_Event_CloseWindow

End


Re: 2DDrawing Transparence en direct

Publié : mer. 01/janv./2020 22:05
par Ekim
c'est cool sa marche vachement bien merci :D

Mais si je décide de poser une autre image en transparence sur la 1ere, devrais je également faire une copie de cette dernière?

Re: 2DDrawing Transparence en direct

Publié : jeu. 02/janv./2020 1:56
par case
non :mrgreen:

ce que tu avais

image 0 celle que tu modifiais et que tu affiche sur ton gadget
image 2 celle en rouge avec la transparence

c'est comme avec un crayon si tu appuie légèrement quand tu dessine sur une feuille de papier a chaque passage ton trait sera plus foncé.
si tu veux que le trait soit toujours a la même couleur et que tu veux modifier ton dessin tu dois gommer l'ancien trait ou tu veux repasser

la ta feuille c'est ton imageouput() qui contiens ton image. ton crayon c'est ton image 2

tu dois remettre ta feuille a vide chaque fois que tu veux redessiner dessus pour garder la même transparence.
c'est pour ça que tu dois garder l'image d'origine et l'utiliser comme base pour redessiner par dessus. mais tes crayons t'a pas besoin de les avoir deux fois

Code : Tout sélectionner


UseJPEGImageDecoder()
UsePNGImageDecoder()
Global Window_1
Enumeration 
  #papier=1
  #image_de_fond
  #crayon1
  #crayon2
  #crayon3
  #window
  #image_gadget
  #trackbar
  #trackbar2
  #trackbar3
  #string
  #button
EndEnumeration
CreateImage(#papier,440,290,32)
CreateImage(#crayon1,440,290,32,$0000FF)
CreateImage(#crayon2,440,290,32,$FF0000)
CreateImage(#crayon3,440,290,32,$00FF00)


Procedure OpenWindow_1(x = 0, y = 0, width = 600, height = 420)
  OpenWindow(#window, x, y, width, height, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(#image_gadget, 70, 50, 440, 290, 0, #PB_Image_Border)
  TrackBarGadget(#trackbar, 40, 350, 520, 20, 0, 255)
  TrackBarGadget(#trackbar2, 40, 370, 520, 20, 0, 255)
  TrackBarGadget(#trackbar3, 40, 390, 520, 20, 0, 255)
  SetGadgetState(#trackbar,5)
  ButtonGadget(#button, 10, 10, 40, 30, "Image")
EndProcedure


Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #button
          pic$ = OpenFileRequester("Image indexe",pic$,"",0)
          If LoadImage(#image_de_fond,pic$)
            ResizeImage(#image_de_fond,440,290,#PB_Image_Smooth)
            SetGadgetState(#image_gadget,ImageID(#image_de_fond))
          Else
            Debug "Erreur de chargement"
          EndIf
      EndSelect
    Case #PB_Event_Timer
      If EventTimer() = 1
        If IsImage(#image_de_fond)
          trs=GetGadgetState(#trackbar)
          StartDrawing(ImageOutput(#papier))         
          DrawImage(ImageID(#image_de_fond),0,0)        ; dessine la copie de l'image d'origine          
          DrawAlphaImage(ImageID(#crayon1),0,0,GetGadgetState(#trackbar))    ; dessine l'image alpha
          DrawAlphaImage(ImageID(#crayon2),0,0,GetGadgetState(#trackbar2))    ; dessine l'image alpha
          DrawAlphaImage(ImageID(#crayon3),0,0,GetGadgetState(#trackbar3))    ; dessine l'image alpha
          StopDrawing()
          SetGadgetState(#image_gadget,ImageID(#papier))
        EndIf
      EndIf
  EndSelect
  ProcedureReturn #True
EndProcedure
OpenWindow_1(0,0,600,420)

AddWindowTimer(#window,1,125)

Repeat
  Event = WaitWindowEvent()
  
  Window_1_Events(Event)
  
Until Event = #PB_Event_CloseWindow

End


Re: 2DDrawing Transparence en direct

Publié : jeu. 02/janv./2020 22:55
par Ekim
Oui ça c'est géant :D
trop cool merci pour le bonus

j'ai tout de même essayé d'introduire un "DrawingMode(#PB_2DDrawing_XOr)" mais malheureusement ceci ne semble pas fonctionner,
j'ai tout de suite pensé à la surcharge process

c'est bien ça?

Code : Tout sélectionner

UseJPEGImageDecoder()
UsePNGImageDecoder()
Global Window_1
Enumeration
  #papier=1
  #image_de_fond
  #crayon1
  #crayon2
  #crayon3
  #window
  #image_gadget
  #trackbar
  #trackbar2
  #trackbar3
  #string
  #button
EndEnumeration
CreateImage(#papier,440,290,32)
CreateImage(#crayon1,440,290,32,$0000FF)
CreateImage(#crayon2,440,290,32,$FF0000)
CreateImage(#crayon3,440,290,32,$00FF00)


Procedure OpenWindow_1(x = 0, y = 0, width = 600, height = 420)
  OpenWindow(#window, x, y, width, height, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(#image_gadget, 70, 50, 440, 290, 0, #PB_Image_Border)
  TrackBarGadget(#trackbar, 40, 350, 520, 20, 0, 255)
  TrackBarGadget(#trackbar2, 40, 370, 520, 20, 0, 255)
  TrackBarGadget(#trackbar3, 40, 390, 520, 20, 0, 255)
  SetGadgetState(#trackbar,5)
  ButtonGadget(#button, 10, 10, 40, 30, "Image")
EndProcedure


Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #button
          pic$ = OpenFileRequester("Image indexe",pic$,"",0)
          If LoadImage(#image_de_fond,pic$)
            ResizeImage(#image_de_fond,440,290,#PB_Image_Smooth)
            SetGadgetState(#image_gadget,ImageID(#image_de_fond))
          Else
            Debug "Erreur de chargement"
          EndIf
      EndSelect
    Case #PB_Event_Timer
      If EventTimer() = 1
        If IsImage(#image_de_fond)
          trs=GetGadgetState(#trackbar)
          StartDrawing(ImageOutput(#papier))   
          DrawingMode(#PB_2DDrawing_XOr)
          DrawImage(ImageID(#image_de_fond),0,0)        ; dessine la copie de l'image d'origine         
          DrawAlphaImage(ImageID(#crayon1),0,0,GetGadgetState(#trackbar))    ; dessine l'image alpha
          DrawAlphaImage(ImageID(#crayon2),0,0,GetGadgetState(#trackbar2))    ; dessine l'image alpha
          DrawAlphaImage(ImageID(#crayon3),0,0,GetGadgetState(#trackbar3))    ; dessine l'image alpha
          StopDrawing()
          SetGadgetState(#image_gadget,ImageID(#papier))
        EndIf
      EndIf
  EndSelect
  ProcedureReturn #True
EndProcedure
OpenWindow_1(0,0,600,420)

AddWindowTimer(#window,1,125)

Repeat
  Event = WaitWindowEvent()
 
  Window_1_Events(Event)
 
Until Event = #PB_Event_CloseWindow

End

Re: 2DDrawing Transparence en direct

Publié : ven. 03/janv./2020 1:16
par case
drawingmode() ne fonctionne pas avec les images
seulement avec les commandes de dessin de pure basic comme box, circle, drawtext etc

Re: 2DDrawing Transparence en direct

Publié : ven. 03/janv./2020 23:54
par Ekim
Ok c'est dommage(

en tous cas merci pour tes lumières :wink: