[5.40b1]VectorCanvas et transparence

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.40b1]VectorCanvas et transparence

Message par blendman »

J'ai testé ce matin la nouvelle bibliothèque de la 5.40 VectorDrawing :).

Je n'ai pas réussi à afficher une image avec transparence créé avec CreateImage().
Savez-vous comment on peut faire ça ?

Code : Tout sélectionner

w = 1024
h = 768
If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  LoadImage(0, #PB_Compiler_Home + "examples/Sources/Data/PureBasicLogo.bmp")
  CreateImage(1,w,h,32,#PB_Image_Transparent)
  
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0)) ; on efface l'image
    Box(0,0,100,100,RGBA(100,0,0,255))
    StopDrawing()
  EndIf
  
  If StartVectorDrawing(CanvasVectorOutput(0))
    DrawVectorImage(ImageID(1),255,w,h)                    
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf
Merci :).
Dernière modification par blendman le mer. 02/sept./2015 9:06, modifié 1 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: VectorCanvas et transparence

Message par Ollivier »

Change le suffixe de ta constante #PB_2DDrawing_Alphablend par #PB_2DDrawing_AllChannel
.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

ça doit venir de la création de ton image car si on charge une image existante, le souci de transparence (noir dans ton exemple) n'a pas lieu.

Code : Tout sélectionner

w = 1024
h = 768

UsePNGImageDecoder()

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  LoadImage(0, #PB_Compiler_Home + "examples/3d/data/textures/grass2.png")
  
  If StartVectorDrawing(CanvasVectorOutput(0))
    MovePathCursor(100, 100)
    DrawVectorImage(ImageID(0))                    
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

@Blendman: Remplace

Code : Tout sélectionner

Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0)) ; on efface l'image
par

Code : Tout sélectionner

Box(0, 0, OutputWidth(), OutputHeight(), RGBA(255,255,255,0)) ; on efface l'image

Code : Tout sélectionner

w = 1024
h = 768

UsePNGImageDecoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  CreateImage(1, w, h, 32, #PB_Image_Transparent)
  
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, OutputWidth(), OutputHeight(), RGBA(255,255,255,0)) ; on efface l'image
    Box(0,0,100,100,RGBA(100,0,0,255))
    StopDrawing()
  EndIf
  
  ShowLibraryViewer("image", 1)
    
  If StartVectorDrawing(CanvasVectorOutput(0))
    MovePathCursor(50, 50)

    DrawVectorImage(ImageID(1))                    
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf
J'ai laissé le debug de l'image pour bien montrée qu'elle est transparente
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: VectorCanvas et transparence

Message par blendman »

En fait, l'image, n'est hélas toujours pas transparence, en mettant en blanc.
Le canvas a un fond blanc, mais si on lui met un autre fond, on voit bien qu'elle n'est pas transparente ^^ :

Code : Tout sélectionner

w = 1024
h = 768

UsePNGImageDecoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
 
  CreateImage(1, w, h, 32, #PB_Image_Transparent)
 
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, OutputWidth(), OutputHeight(), RGBA(255,255,255,0)) ; on efface l'image
    Box(0,0,100,100,RGBA(100,0,0,255))
    StopDrawing()
  EndIf
 
  ShowLibraryViewer("image", 1)
   
  If StartVectorDrawing(CanvasVectorOutput(0))
    
    ; ajout d'un fond de couleur pour visualiser la transparence
    AddPathBox(0, 0, w,h)
    VectorSourceColor(RGBA(255,120,120,255)) 
    FillPath()
    
    ; the image
    MovePathCursor(50, 50)

    DrawVectorImage(ImageID(1))                   
    StopVectorDrawing()
  EndIf
 
  Repeat
    Event = WaitWindowEvent()
   
  Until event = #PB_Event_CloseWindow
 
EndIf
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: VectorCanvas et transparence

Message par Ollivier »

Maintenant, corrige la couleur de ton 1er box à 0,0,0,0 au lieu de 255,255,255,0 s'il te plaît.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

Merdum de de merdum :!: Je me suis fait avoir.

L'image est bien transparente quand je l'enregistre. Pourtant si on la charge tout comme grass1.png elle ressort quand même avec un fond blanc. Strange.

Code : Tout sélectionner

w = 1024
h = 768

UsePNGImageDecoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  CreateImage(1, w, h, 32, #PB_Image_Transparent)
  
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, OutputWidth(), OutputHeight(), RGBA(255,255,255,0)) ; on efface l'image
    Box(0,0,100,100,RGBA(100,0,0,255))
    StopDrawing()
  EndIf
  
  SaveImage(1, "test1.png", #PB_ImagePlugin_PNG)
  LoadImage(1, "test1.png")
  ShowLibraryViewer("image", 1)
    
  If StartVectorDrawing(CanvasVectorOutput(0))
    AddPathBox(0, 0, w,h)
    VectorSourceColor(RGBA(255,120,120,255)) 
    FillPath()
    
    MovePathCursor(50, 50)

    DrawVectorImage(ImageID(1))                    
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf
On peut en conclure que c'est la création d'image transparente qui ne fonctionne pas. L'affichage est correcte si on charge des images PNG issus d'autres logiciels.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

Ollivier a écrit :Maintenant, corrige la couleur de ton 1er box à 0,0,0,0 au lieu de 255,255,255,0 s'il te plaît.
ça ne change strictement rien.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: VectorCanvas et transparence

Message par Ollivier »

Falsam a écrit :ça ne change strictement rien.
Merci Falsam, si cette dernière tentative ci-dessous est en échec, alors c'est un bug propre à la 5.40. (je suis en 5.22) (Edité: c'est peut-être alors le mode 2DDRAWING à mettre sur TRANSPARENT (comme les textes) plutôt que AllChannels.)

(image 256x256x32bpp avec mode dessin "AllChannels" encore:

Code : Tout sélectionner

For Y=0 to 255
For X=0 to 255
Box(x,y,1,1, rgba(x,0,0,y))
Next
Next
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: VectorCanvas et transparence

Message par blendman »

On peut en conclure que c'est la création d'image transparente qui ne fonctionne pas. L'affichage est correcte si on charge des images PNG issus d'autres logiciels.
comme c'est une toute nouvelle lib, il doit y avoir encore quelques bugs et je crois que celui-ci en fait partie, puisque ça fonctionne avec les images importées (non modifiée), mais pas avec les images créées ou modifiées.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

J'ai repris ton code Blendman et j'ai enregistré l'image en cours de création avant de l'afficher.

Code : Tout sélectionner

w = 1024
h = 768

UsePNGImageDecoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  CreateImage(1, w, h, 32, #PB_Image_Transparent)
  
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, OutputWidth(), OutputHeight(), RGBA(0,0,0,0)) ; on efface l'image
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Box(0, 0, 100, 100 , RGBA(100,0,0,120))
    
    StopDrawing()
  EndIf
  
  SaveImage(1, "test1.png", #PB_ImagePlugin_PNG)
  FreeImage(1)
  
  ;A ce stade, si j'ouvre l'image avec un logiciel tierce, elle est correcte avec sa couche alpha
  
  LoadImage(1, "test1.png")
  ShowLibraryViewer("image", 1)
  
  ;La aussi l'image est correcte
  
  If StartVectorDrawing(CanvasVectorOutput(0))
    AddPathBox(0, 0, w,h)
    VectorSourceColor(RGBA(255,120,120,255)) 
    FillPath()
    
    MovePathCursor(50, 50)
    
    ;ça se gate ici. La fonction DrawVectorImage ne gere pas la couche alpha des images.
    DrawVectorImage(ImageID(1))
    
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf
Dernière modification par falsam le mar. 01/sept./2015 12:40, modifié 4 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: VectorCanvas et transparence

Message par Mesa »

Le mélange de StartVectorDrawing et de StartDrawing risque de poser des problèmes à ceux qui n'auront pas bien assimilé les notions de chemin, de source et de couche introduites avec VectorDrawing. Il faut bien lire l'introduction à la bibliothèque VectorDrawing.
Attention au mélange d'images matricielles (bmp, png, …) avec StartDrawing avec des images vectorielles avec StartVectorDrawing.

Code : Tout sélectionner

; voir BeginVectorLayer()



w = 380
h = 200

If OpenWindow(0, 0, 0, w, h, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, w, h)
  
  ;IMAGE MATRICIELLE
  LoadImage(0, #PB_Compiler_Home + "examples/Sources/Data/PureBasicLogo.bmp")
  SetGadgetAttribute(0,#PB_Canvas_Image,ImageID(0))
  
  ;IMAGES VECTORIELLES
  If StartVectorDrawing(CanvasVectorOutput(0))
    
    
    ; Dessin semi-transparent sur la couche de base
    AddPathCircle(75, 75, 60)      
    VectorSourceColor(RGBA(255, 0, 0, 127))
    FillPath()      
    AddPathCircle(125, 75, 60)
    VectorSourceColor(RGBA(0, 0, 255, 127))
    FillPath()    
    
    
    ; Dessin opaque sur une couche semi-transparente
    BeginVectorLayer(127)
    AddPathCircle(260, 75, 60)    
    VectorSourceColor(RGBA(255, 0, 0, 255))
    FillPath()        
    AddPathCircle(310, 75, 60)
    VectorSourceColor(RGBA(0, 0, 255, 255))
    FillPath()    
    EndVectorLayer()
    
    StopVectorDrawing()
    
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  
EndIf

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

Re: VectorCanvas et transparence

Message par Ollivier »

Hey! Dans le Start/Stop VectorDrawing: l'option AllChannels doit y être aussi! Non?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

Bonjour Mesa. Je pense que tu es un peu hors sujet dans ta réponse car tu ne crées pas d'image avec fond transparent. :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: VectorCanvas et transparence

Message par falsam »

Ollivier a écrit :Hey! Dans le Start/Stop VectorDrawing: l'option AllChannels doit y être aussi! Non?
Hey Olliver, installe cette version 5.40 dans un autre dossier et fait un test :mrgreen:

Tu pourras utiliser plusieurs compilateurs à partir d'un seul IDE
:arrow: http://www.purebasic.fr/french/viewtopi ... 21&t=13137
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre