2DDrawing Transparence en direct

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

2DDrawing Transparence en direct

Message 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)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: 2DDrawing Transparence en direct

Message 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

ImageImage
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing Transparence en direct

Message 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?
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: 2DDrawing Transparence en direct

Message 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

ImageImage
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing Transparence en direct

Message 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
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: 2DDrawing Transparence en direct

Message par case »

drawingmode() ne fonctionne pas avec les images
seulement avec les commandes de dessin de pure basic comme box, circle, drawtext etc
ImageImage
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing Transparence en direct

Message par Ekim »

Ok c'est dommage(

en tous cas merci pour tes lumières :wink:
Répondre