Page 1 sur 2
[5.40b1]VectorCanvas et transparence
Publié : mar. 01/sept./2015 7:52
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

.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 9:18
par Ollivier
Change le suffixe de ta constante #PB_2DDrawing_Alphablend par #PB_2DDrawing_AllChannel
.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 9:25
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
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:04
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
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:24
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
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:44
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.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:46
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.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:46
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.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 10:59
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
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:32
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.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:34
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
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:35
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.
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:38
par Ollivier
Hey! Dans le Start/Stop VectorDrawing: l'option AllChannels doit y être aussi! Non?
Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:39
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.

Re: VectorCanvas et transparence
Publié : mar. 01/sept./2015 11:43
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
Tu pourras utiliser plusieurs compilateurs à partir d'un seul IDE
http://www.purebasic.fr/french/viewtopi ... 21&t=13137