j'y arrive pas : alphablend et drawtext

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

j'y arrive pas : alphablend et drawtext

Message par case »

je voudrait afficher une font en transparence par dessus un fond coloré pour faire une font bitmap en sprites
mais pas moyen, soit c'est un bug soit je me plante totalement dans les commandes a utiliser.

pourtant d'apres la doc

#PB_2DDrawing_AlphaBlend
Les opérations de dessin seront fusionnées avec le fond en utilisant le canal alpha pour gérer la transparence de chaque pixel. RGBA() peut être utilisé pour définir une couleur qui intègre un degré de transparence pour les commandes comme FrontColor(), Box(), DrawText() etc
DrawText()
Resultat = DrawText(X, Y, Texte$ [, CouleurTexte [, CouleurFond]])
Couleur du texte.

Si le paramètre n'est pas précisé, la couleur définie par FrontColor() sera utilisée par défaut.

Les fonctions RGB() ou RGBA() peuvent être utilisées pour définir facilement une couleur.



;

Code : Tout sélectionner

initsprite()
Global main=OpenWindow(#PB_Any,800,600,800,600,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global scr=OpenWindowedScreen(WindowID(main),0,0,800,600)
Global fnt=LoadFont(#PB_Any,"consolas",16) 

; dessine un fond aleatoire pour le test
StartDrawing(ScreenOutput())
For k=0 To 24
  LineXY(0,k,24,k,RGB(Random(200)+55,Random(200)+55,Random(200)+55))
Next
fond=GrabDrawingImage(#PB_Any,0,0,24,24)
StopDrawing()

; affiche les glyphes de la font par dessus le fond en transparence... ne fonctionne pas

For a =032 To 255
  WaitWindowEvent(0)
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  DrawingFont(FontID(fnt))
  DrawImage(ImageID(fond),0,0)
  DrawImage(ImageID(fond),0,24)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  FrontColor(RGBA(255,255,255,0))   ; devrait etre transparent (alpha a zero)
  BackColor(RGBA(0,0,0,255))        
  DrawText(0,0,Chr(a)) 
  DrawText(0,24,Chr(a),RGBA(0,0,0,0),RGB(255,255,255)); devrait etre transparent (alpha a zero)
  StopDrawing()  
  FlipBuffers()
  Delay(100)
Next

si quelqu'un a la soluce je veux bien :mrgreen:
Dernière modification par case le sam. 13/juin/2020 15:08, modifié 1 fois.
ImageImage
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: j'y arrive pas : alphablend et drawtext

Message par Marc56 »

#PB_2DDrawing_AlphaBlend ne semble pas fonctionner partout. Par contre avec ceci le texte est sur fond transparent, mais ce n'est peut-être pas ce que tu veux ?

Code : Tout sélectionner

DrawingMode(#PB_2DDrawing_Transparent)
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: j'y arrive pas : alphablend et drawtext

Message par case »

en fait je viens de faire d'autres tests, il semblerait que pour avoir de la transparence sur le texte il faille aussi que le fond (backcolor) soit transparent
de plus cela ne semble fonctionner que sur canvas. et pas sur un screen.

bref. je vais tenter une autre approche :)


Code : Tout sélectionner


InitSprite()
Global main=OpenWindow(#PB_Any,0,00,1600,600,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global canvas=CanvasGadget(#PB_Any,800,0,800,600)
Global scr=OpenWindowedScreen(WindowID(main),0,0,800,600)
;OpenScreen(800,600,32,"")
Global fnt=LoadFont(#PB_Any,"consolas",16) 

; dessine un fond aleatoire pour le test
StartDrawing(ScreenOutput())
For k=0 To 24
  LineXY(0,k,24,k,RGB(Random(200)+55,Random(200)+55,Random(200)+55))
Next
fond=GrabDrawingImage(#PB_Any,0,0,24,24)
StopDrawing()

; affiche les glyphes de la font par dessus le fond en transparence... ne fonctionne pas

For a =032 To 255
  WaitWindowEvent(0)
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  DrawingFont(FontID(fnt))
  DrawingMode(#PB_2DDrawing_Default) 
  DrawImage(ImageID(fond),0,0)
  DrawImage(ImageID(fond),0,24)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  FrontColor(RGBA(0,0,0, 10))
  BackColor(RGBA(255,255,255, 100))   
  
  DrawText(0,0,Chr(a)) 
  DrawText(0,24,Chr(a),RGBA(0,0,0,0),RGBA(255,255,255,255)); devrait etre transparent (alpha a zero)
  StopDrawing() 
  FlipBuffers()
    
   
  StartDrawing(CanvasOutput(canvas))
  DrawingFont(FontID(fnt))
  DrawingMode(#PB_2DDrawing_Default) 
  DrawImage(ImageID(fond),0,0)
  DrawImage(ImageID(fond),0,24)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  FrontColor(RGBA($ff,0,0,10))
  BackColor(RGBA(255,255,255,100)   )
  DrawText(0,0,Chr(a)) 
  DrawText(0,24,Chr(a),RGBA(0,0,0,0),RGBA(255,255,255,255)); devrait etre transparent (alpha a zero)
  StopDrawing() 
  
  Delay(100)
Next


ImageImage
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: j'y arrive pas : alphablend et drawtext

Message par case »

voila ce que je voulais faire, je suis passé par des sprites.

Code : Tout sélectionner

InitSprite()
Global main=OpenWindow(#PB_Any,0,00,800,600,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global scr=OpenWindowedScreen(WindowID(main),0,0,800,600)
;OpenScreen(800,600,32,"")
Global fnt=LoadFont(#PB_Any,"terminal",20)

; dessine un fond aleatoire pour le test
StartDrawing(ScreenOutput())
For k=0 To 24
  LineXY(0,k,24,k,RGB(Random(200)+55,Random(200)+55,Random(200)+55))
Next
fond=GrabDrawingImage(#PB_Any,0,0,24,24)
DrawingFont(FontID(fnt))
fw=TextWidth("W")
fh=TextHeight("W")
StopDrawing()
For a =032 To 255
  WaitWindowEvent(0)
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Default) 
  DrawingFont(FontID(fnt))
  DrawText(0,0,Chr(a),$ffffff,0)
  StopDrawing()
  tmp=GrabSprite(#PB_Any,0,0,fw,fh)
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(fond),0,0)  
  StopDrawing()
  TransparentSpriteColor(tmp,$ffffff)
  DisplayTransparentSprite(tmp,0,0)  
  FreeSprite(tmp)
  FlipBuffers()
  Delay(100)
Next




ImageImage
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: j'y arrive pas : alphablend et drawtext

Message par Ollivier »

T'y es allé à l'arrache !

#PB_2DDrawing_Alphablend est sensé fonctionner sur tous les supports.

Par contre, le mélange entre motifs (avant-plan avec arrière-plan) d'un starDrawing n'est pas le même que le mélange des sprites entre, et avec les fond d'écran : ce dernier est beaucoup plus maniable avec SpriteBlendingMode() que le mélange d'un AlphaBlend (option #PB_2DDrawing_Alphablend).

Ce "dernier" (AlphaBlend de la lib 2DDrawing) fait juste un mélange pondéré par le canal Alpha.

1 image bleu (255) sur une image rouge (255) donnera du bleu, du magenta, du rouge, ou du noir sur les 2 canaux respectifs des images bleu et rouge.
255, 0 : bleu
255, 255 : magenta
0, 255 : rouge
0, 0 : noir

Ceci en partant d'un support à canal alpha nul.

Le canvas et l'image démarre avec des canaux inverses (à vérifier) :

255, 255, 255, 0 pour le canvas
et
0, 0, 0, 255 pour l'image.

Donc d'office ton arrière plan rouge ne va pas s'afficher pareil, et donc ne va pas se mélanger pareil avec l'avant-plan bleu.

Pour obtenir des résultats standard, dans le Start/Stop drawing de l'image :

Code : Tout sélectionner

W = OutputWidth()
H = OutputHeight()
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, W, H, RGBA(255, 255, 255, 0) )
Ces données sont à vérifier, mais il me semble que la subtilité est aussi là.

Pour obtenir des résultats supérieurs en terme de diversité de mélange comparé au sprite, il faut modifier DrawingMode() à la volée et ne jamais oublier que c'est DrawAlphaImage() seul qui fonctionne !
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: j'y arrive pas : alphablend et drawtext

Message par case »

oui j'ai vu la réponse sur le forum us...

bon c'est donc normal que ca ne fonctionne pas ...
#PB_2DDrawing_Alphablend est sensé fonctionner sur tous les supports.


ben non visiblement, pas sur un screenoutput() ^^ c'est noté dans la doc en plus... j'ai un peu honte :p
ImageImage
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: j'y arrive pas : alphablend et drawtext

Message par Ollivier »

Moi, je n'ai pas honte, tu as coupé mon Par contre. Quand << quelquechose est sensé faire quelquechose. Par contre, etc... >> Avec un tas d'explications précises tant que possible... On peut lourdement douter de l'utilité même de ce qui est sensé, mais n'est pas.

:D

Je recopie le lien d'exemple : https://www.purebasic.fr/french/viewtop ... 8&start=41 (mis aussi sur le forum EN).

La trame des caractères est blendée avec les couleurs. Comme il n'y a pas de dégradé, ça ne se voit pas au 1er coup d'oeil...

Mais, avec les touches de direction, on peut voir que c'est vraiment rapide.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: j'y arrive pas : alphablend et drawtext

Message par kernadec »

bjr à tous
Et en utilisant une fonte multicolore cela pourrait peut être le faire :D
cordialement
https://www.fontfabric.com/fonts/multicolore/

voir aussi ce code très chouette pour les textes en couleurs

https://www.purebasic.fr/english/viewto ... 12&t=32678
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: j'y arrive pas : alphablend et drawtext

Message par case »

merci pour vos idées les copains :)
ImageImage
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: j'y arrive pas : alphablend et drawtext

Message par Mesa »

Pour un maximum de vitesse, il faut reste sur les sprites et ne pas utiliser les images:

Code : Tout sélectionner

If InitSprite()
  InitKeyboard()
  InitMouse()
EndIf

Global main=OpenWindow(#PB_Any,800,600,800,600,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 
Global scr=OpenWindowedScreen(WindowID(main),0,0,800,600) 
Global fnt=LoadFont(#PB_Any,"consolas",16)  

; dessine un fond aleatoire pour le test 
fond=CreateSprite(#PB_Any, 800, 600)
StartDrawing(SpriteOutput(fond))
For k=0 To 600 
  LineXY(0,k,800,k,RGB(Random(200)+55,Random(200)+55,Random(200)+55)) 
Next 
StopDrawing()


Dim chars(255)
For a =032 To 255
  chars(a) = CreateSprite(#PB_Any, 24, 24, #PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(chars(a)))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(0,0,Chr(a),RGBA(255,0,0,128),RGBA(0,0,0,255))
  StopDrawing()
Next a


Repeat 
  
  Repeat
    
    Evenement = WindowEvent() 
    
    Select Evenement   
      Case #PB_Event_CloseWindow
        End
    EndSelect 
  Until Evenement=0
  
  
  FlipBuffers() 
  ExamineKeyboard() 
  
  a=Random(255,32)
  DisplaySprite(fond,0,0)
  TransparentSpriteColor(chars(a),$0) 
  DisplayTransparentSprite(chars(a), Random(800),Random(600))
  Delay(100)   
  
  
Until KeyboardPushed(#PB_Key_Escape)


M.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: j'y arrive pas : alphablend et drawtext

Message par kernadec »

bjr mesa
au sujet de ton code chez moi je ne vois que des ligne sur tout l'ecran
et des points rouges furtifs et aléatoires
je suis sous seven PB 570LTS

voici un agrandissement du code des caractères de @case
je pense avoir compris que son idée est de faire apparaitre le fond seulement à l' intérieur des caractères

cordialement

Code : Tout sélectionner

InitSprite()
Global main=OpenWindow(#PB_Any,0,0,150,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Global scr=OpenWindowedScreen(WindowID(main),0,0,150,100)
;OpenScreen(800,600,32,"")
Global fnt=LoadFont(#PB_Any,"terminal",72)

; dessine un fond aleatoire pour le test
StartDrawing(ScreenOutput())
For k=0 To 80
  LineXY(0,k,80,k,RGB(Random(200)+55,Random(200)+55,Random(200)+55))
Next
fond=GrabDrawingImage(#PB_Any,0,0,50,80)
DrawingFont(FontID(fnt))
fw=TextWidth("W")
fh=TextHeight("W")
StopDrawing()
For a =032 To 255
  WaitWindowEvent(0)
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Default)
  DrawingFont(FontID(fnt))
  DrawText(40,0,Chr(a),$ffffff,0)
  StopDrawing()
  tmp=GrabSprite(#PB_Any,40,0,fw,fh)
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(fond),40,0) 
  StopDrawing()
  TransparentSpriteColor(tmp,$ffffff)
  DisplayTransparentSprite(tmp,40,0) 
  FreeSprite(tmp)
  FlipBuffers()
  Delay(100)
Next
Avatar de l’utilisateur
case
Messages : 1528
Inscription : lun. 10/sept./2007 11:13

Re: j'y arrive pas : alphablend et drawtext

Message par case »

c'est ca l'idée oui je pensais que c’était possible avec drawtext() mais ce n'est pas le cas, je suis passé par des sprites :)
merci pour vos trouvailles ^^
ImageImage
Répondre