Page 1 sur 1

j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 13:54
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:

Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 14:22
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)

Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 14:46
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



Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 14:57
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





Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 19:19
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 !

Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 20:38
par Marc56

Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 21:37
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

Re: j'y arrive pas : alphablend et drawtext

Publié : sam. 13/juin/2020 23:45
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.

Re: j'y arrive pas : alphablend et drawtext

Publié : dim. 14/juin/2020 9:08
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

Re: j'y arrive pas : alphablend et drawtext

Publié : dim. 14/juin/2020 18:08
par case
merci pour vos idées les copains :)

Re: j'y arrive pas : alphablend et drawtext

Publié : ven. 19/juin/2020 8:51
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.

Re: j'y arrive pas : alphablend et drawtext

Publié : dim. 21/juin/2020 9:30
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

Re: j'y arrive pas : alphablend et drawtext

Publié : dim. 21/juin/2020 13:35
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 ^^