Page 1 sur 2

Créer une Image transparente !

Publié : jeu. 12/nov./2009 15:25
par Thyphoon
J'ai enfin trouvé comment créer une image transparente
je partage le code car je me dis que ça peut servir !

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")

  If CreateImage(0, 255, 255,32)
   
    StartDrawing(ImageOutput(0))
     *MemoryAddress = DrawingBuffer() 
    FillMemory(*MemoryAddress,DrawingBufferPitch()*ImageHeight(0),RGBA(0,0,0,0),#PB_Long)
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
      Box(0,0,100,100,RGBA(255,0,0,255))
    For k=0 To 255
      FrontColor(RGB(k,0, k))  ; a rainbow, from black to pink
      Line(0, k, 255, 0)
    Next

    ;DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image created easely...",RGBA(255,255,255,255))

    StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
    
  EndIf
  
 

        
  Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Repaint
      StartDrawing(WindowOutput(0))
        DrawAlphaImage(ImageID(0), 20, 10)
      StopDrawing()    
    EndIf
    
  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
  
EndIf

End   ; All the opened 

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 18:02
par Ar-S
j'attendrai la version final de la 4.40 pour m'y mettre serieusement.

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 18:18
par Thyphoon
J'aimerais faire la même chose avec les sprites mais ça ne marche pas :(

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 22:48
par flaith
Bizarre, chez moi je n'ai que le carré rouge et le texte qui s'affichent :?

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 23:01
par Thyphoon
flaith a écrit :Bizarre, chez moi je n'ai que le carré rouge et le texte qui s'affichent :?
c'est normal vu que le donf est transparent .... A oui je comprends pouquoi tu dis ça ! j'ai repris un exemple de la documentation pour travaillé et j'ai pas fait attention que le dégradé qui est prévu dans le code ne s'affiche pas :P

en vérité je pense qu'il y a un bug avec Line car avec LineXY ça fonctionne

Code : Tout sélectionner

    For k=0 To 255
      ; a rainbow, from black to pink
      LineXY(0, k, 255,k, RGBA(k,0, k,255))
      
    Next

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 23:13
par Le Soldat Inconnu
alors dans l'ordre :

le bug avec la ligne, il ne faut pas écrire

Code : Tout sélectionner

Line(0, k, 255, 0)
mais

Code : Tout sélectionner

Line(0, k, 255, 1)
ensuite, l'image transparente. Un poil compliqué je trouve, avec PB4.40 je préfère comme ça (vu dans les exemples de la 4.40) :

Code : Tout sélectionner

CreateImage(0, 100, 100, 32)
StartDrawing(ImageOutput(0))
	; ON dessine juste sur la couche alpha
	DrawingMode(#PB_2DDrawing_AlphaChannel)
	; on met toutes l'image avec un alpha = 0 donc transparent
	Box(0, 0, OutputWidth(), OutputHeight(), 0)
	DrawingMode(#PB_2DDrawing_AlphaBlend)
	; Ton dessin avec couche alpha
	
StopDrawing()

Re: Créer une Image transparente !

Publié : jeu. 12/nov./2009 23:22
par Thyphoon
Le Soldat Inconnu a écrit :alors dans l'ordre :

le bug avec la ligne, il ne faut pas écrire

Code : Tout sélectionner

Line(0, k, 255, 0)
mais

Code : Tout sélectionner

Line(0, k, 255, 1)
Je viens juste de m'en rendre compte en faisant des tests car je trouvais gros quand même qu'il y ai un bug là et que personne ne l'ai vu et surtout que j'utlise dans mon jeu cette commande et que ça marchait.
Le Soldat Inconnu a écrit : ensuite, l'image transparente. Un poil compliqué je trouve, avec PB4.40 je préfère comme ça (vu dans les exemples de la 4.40) :

Code : Tout sélectionner

CreateImage(0, 100, 100, 32)
StartDrawing(ImageOutput(0))
	; ON dessine juste sur la couche alpha
	DrawingMode(#PB_2DDrawing_AlphaChannel)
	; on met toutes l'image avec un alpha = 0 donc transparent
	Box(0, 0, OutputWidth(), OutputHeight(), 0)
	DrawingMode(#PB_2DDrawing_AlphaBlend)
	; Ton dessin avec couche alpha
	
StopDrawing()
A oui j'avais raté cet exemple ! Merci beaucoup c'est sur que c'est mieux que mon système :P

par contre ce qui est dommage c'est qu'on ne peut pas faire ça avec SpriteOutput()
et pas facile de transformer une image en sprite .... :( la seul solution que j'ai trouvé c'est de sauvegardé dans un fichier temporaire l'image créer et de la charger ensuite en tant que sprite ... :( mais ça tient de la bidouille

Re: Créer une Image transparente !

Publié : ven. 13/nov./2009 11:18
par kwandjeen
Dessine sur le sprite, ou alors j'ai pas compris ce que tu voulais faire.

Code : Tout sélectionner

InitSprite()

If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")
  OpenWindowedScreen(WindowID(0),0,0,500,300,0,0,0)
  If CreateImage(0, 255, 255, 32)
      StartDrawing(ImageOutput(0))
       ; ON dessine juste sur la couche alpha
       DrawingMode(#PB_2DDrawing_AlphaChannel)
       ; on met toutes l'image avec un alpha = 0 donc transparent
       Box(0, 0, 255, 255, 0)
       DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
      Box(0,0,100,100,RGBA(255,0,0,255))
    For k=0 To 255
      FrontColor(RGB(k,0, k))  ; a rainbow, from black to pink
      Line(0, k, 255, 0)
    Next 
        FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image created easely...",RGBA(255,255,255,255))
    StopDrawing()
  EndIf
  
  CreateSprite(0,255,255)
  StartDrawing(SpriteOutput(0))
    DrawAlphaImage(ImageID(0),0,0)
  StopDrawing()
       
  Repeat
    EventID = WindowEvent()
   
      ClearScreen(RGB(128,128,128))
      DisplayTransparentSprite(0,10+x,10)  
      If x<250
        x+5
      Else
        x=10
      EndIf
   FlipBuffers()
  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
 
EndIf

End   ; All the opened 

Code : Tout sélectionner

  CreateSprite(0,255,255)
  StartDrawing(SpriteOutput(0))
    DrawAlphaImage(ImageID(0),0,0)
  StopDrawing()
ce n'est pas non plus un si gros code :wink:

Re: Créer une Image transparente !

Publié : ven. 13/nov./2009 17:41
par Thyphoon
Non ça marche pas .... si je dessine une image avec un fond transparent(alpha) et que je le dessine ensuite sur un sprite je perds alors la transparence du fond (vu que part defaut le sprite a un fond noir opaque). tu vois ce que je veux dire ?

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 1:24
par kwandjeen
Pourtant mon code fonctionne puisque la couleur noire est considéré comme alpha

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 8:08
par Thyphoon
J'avoue que je comprends pas ! Ton code fonctionne effectivement ! J'avais fait le test en intégrand dans mon jeu et j'avais un fond noir opaque.
ça fonctionne tres bien dans ton code et pas dans le miens....pourtant je fais exactement la même chose !
En tout cas merci car effectivement ça marche ... mais pourquoi une fois dans mon jeu ça ne marche plus ... je comprends pas ...

si quelqu'un a une idée là je comprends plus ....

Code : Tout sélectionner

Procedure Init_Obj_HighScore()
  If CreateImage(#Img_HighScore, 255, 255, 32)
    StartDrawing(ImageOutput(#Img_HighScore))
    ; ON dessine juste sur la couche alpha
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    ; on met toutes l'image avec un alpha = 0 donc transparent
    Box(0, 0, 255, 255, 0)
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
    Box(0,0,100,100,RGBA(255,0,0,255))
    FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image created easely...",RGBA(255,255,255,255))
    StopDrawing()
  EndIf
 
  CreateSprite(#Img_HighScore,255,255,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#Img_HighScore))
  DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
    DrawAlphaImage(ImageID(#Img_HighScore),0,0)
  StopDrawing()
  CreateSprite3D(#Img_HighScore,#Img_HighScore)  
Endprocedure

;et pour afficher
start3D()
DisplaySprite3D(#Img_HighScore,10,ObjectModeValue(#Obj_HighScore,#Mode_Y))
stop3D()

en convertissant ton code ça marche aussi tres bien avec les sprites 3D ...mais dans mon programme y a rien a faire .... le fond est noir .... :? :|

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 9:10
par Thyphoon
Bon j'ai pas réussi a isolé mon problème !
Si ça amuse certain voici le code source avec le problème

http://9giga.sfr.fr/index.php?m=c9ae77e ... e61246ef15
il faut rentrer dans le repertoire ExtremBrainQuiz puis télécharger Source_ExtrembrainQuizz.zip

le but est d'afficher les scores dans un sprite !

la création de l'image et du sprite ce trouve dans le fichier ObjectData.Pbi ligne 775
la procedure pour l'afficher c'est dans le même fichier juste en dessous 806

cette procedure d'affichage est appelé dans le fichier Main.pb ligne 402
et la procedure qui va créer l'image est appelé dans le fichier network.Pbi ligne 168 juste apres avoir récupéré les infos sur les scores !

voilà, moi je continu a chercher ! si vous avez des questions n'hesitez pas !

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 10:18
par Cool Dji
Hello Thyphoon,

Femme et enfants sont revenus ?
Fini de programmer sans retenue !

Pas facile de débuger les routines
Quand les petits crient des comptines !

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 10:25
par Thyphoon
Cool Dji a écrit :Hello Thyphoon,

Femme et enfants sont revenus ?
Fini de programmer sans retenue !

Pas facile de débuger les routines
Quand les petits crient des comptines !
Comme tu dis ! j'essaye de profiter de quelques minutes de continues quand je peu mais pas evident lolllllllllll
Pourtant j'essaye de les occuper Image

Re: Créer une Image transparente !

Publié : sam. 14/nov./2009 10:37
par Cool Dji
Génial la photo :D