Page 1 sur 2
2DDrawing AlphaBlend
Publié : ven. 21/juin/2019 21:34
par Ekim
Bonsoir à tous)
Pour les inconditionnels du 2DDrawing, quelqu'un peut il m'expliquer comment rendre toutes les zones sombres d'une image transparentes?
mon résidu de code ne fonctionne pas
Code : Tout sélectionner
UseJPEGImageDecoder()
img=CatchImage(#PB_Any,?img_start,?img_end)
If CreateImage(12, 600, 400) ;support initial
StartDrawing(ImageOutput(12))
Box(0,0, 600, 400,#White)
StopDrawing()
EndIf
If CreateImage(5, 600, 400,24, #PB_Image_Transparent) ;Création de la transparence
StartDrawing(ImageOutput(5))
DrawingMode(DrawingMode(#PB_2DDrawing_AlphaChannel))
DrawImage(ImageID(img),0,0)
StopDrawing()
EndIf
StartDrawing(ImageOutput(12)) ;Assemblage
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(5),0,0)
Box(0,0, 600, 400,#Gray)
StopDrawing()
If OpenWindow(#windowp, 0, 0, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(#supp0, 0, 0, 600, 400, ImageID(12))
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
DataSection
img_start:
IncludeBinary "Chemin\image en jpg"
img_end:
EndDataSection
Re: 2DDrawing AlphaBlend
Publié : ven. 21/juin/2019 22:39
par Ollivier
De tête (donc non vérifié notamment) et sans canal alpha initialement (mais c'est une bagatelle à rajouter, c'était pas précisé dans la demande)
Code : Tout sélectionner
;*********************************************************************************************************
cRed = Red(InitialColor)
cGreen = Green(InitialColor)
cBlue = Blue(InitialColor)
cRed * cRed
cGreen * cGreen
cBlue * cBlue
FinalColor = cRed + cGreen + cBlue
FinalColor = Sqr(FinalColor)
FinalColor / Sqr(3)
FinalColor = RGBA(Red(InitialColor), Green(InitialColor), Blue(InitialColor), FinalColor)
Re: 2DDrawing AlphaBlend
Publié : ven. 21/juin/2019 23:00
par Ekim
Oui @Ollivier exact, j'avais oublié de préciser que l'image initial ne possède pas de canal alpha
en même temps il y a un exemple pb qui montre bien qu'il est possible de créer une image alpha
je m'étais juste inspiré mais sa n'a pas fonctionné

Re: 2DDrawing AlphaBlend
Publié : ven. 21/juin/2019 23:38
par Ollivier
Là je ne te comprends pas : je te montre le mécanisme au pixel près. Tu m'indiques qu'il n'y a pas de canal alpha initial donc ma réponse est, on ne peut plus exacte. Et on a l'impression que tu l'as pourtant derrière l'oreille. Avec ma soluce, sans débogueur, c'est aussi rapide. Alors, qu'est-ce qui se passe ?
Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 12:20
par Ekim
Non je parlais de mon 1er poste, j'avais oublié de préciser que la photo n'avait pas de couche alpha rien de plus

Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 12:46
par Ollivier
Ah. Et si tu remplace 24 par 32 dans la création de l'image 5 ?
Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 13:42
par Ekim
Malheureusement cela ne fonctionne pas, un moment donné, il faut parcourir chaque pixels pour en modifier les paramètre car c'est inévitable apparemment
dommage car je pensais qu'il était possible de rendre les pixels transparent selon leur luminosité par moyen d'un simple alphablend

Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 14:01
par Ar-S
Malheureusement cela ne fonctionne pas, un moment donné, il faut parcourir chaque pixels pour en modifier les paramètre car c'est inévitable apparemment
ça parait logique ?
dommage car je pensais qu'il était possible de rendre les pixels transparent selon leur luminosité par moyen d'un simple alphablend
Donc il faut bien qu'il analyse les pixels pour faire ça non ?
J'avoue que sans code fonctionnel j'ai du mal à me mettre dedans.. Sans upper tout ton bazar si c'est trop long, il faut que tu prennes le temps de partager un code et une image afin qu'on puisse tester.
Ensuite en partant d'un JPEG tu es tout de même mal barré pour faire mumuse avec la transparence.
Pour finir, ton but c'est quoi ? Parce que rendre un pixel complètement transparent ça équivaut à supprimer ce pixel. Si tu charges ton image et que tu stock tes pixels dans un tableau (il y a 150 exemples sur le forum), il te suffit ensuite de redessiner cette image en omettant les pixels dont les valeurs RGB sont trop basses pour toi OU (vu que tu fais une box à fond blanc) rempler les valeurs RGB par du blanc
Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 14:39
par Ar-S
Dans l'exemple suivant, je me suis pas fait chier pour le choix des pixel à virer, d’où le contour sur le résultat (et le jpeg n'aide pas non plus).
Mais l'idée est là. En espérant que ça t'aide.
Exemple avec cette image à appeler test.jpg
Code :
Code : Tout sélectionner
UseJPEGImageDecoder()
UseJPEGImageEncoder()
Declare StockPixelTab(IMG)
Declare Dessine(IMG,ValMAX)
Global DimX, DimY
If Not LoadImage(0,"test.jpg",0)
Debug "Erreur, pas de fichier"
End
Else
DimX = ImageWidth(0)
DimY = ImageHeight(0)
Global Dim TabPixel(1,1)
CreateImage(1,DimX, DimY,24)
EndIf
Procedure StockPixelTab(IMG)
Dim TabPixel(DimX, DimY)
StartDrawing(ImageOutput(IMG))
For y = 0 To DimY-1
For x = 0 To DimX-1
TabPixel(x,y) = Point (x,y)
Next x
Next y
StopDrawing()
EndProcedure
Procedure Dessine(IMG,ValMAX)
NBP = DIMX*DIMy
StartDrawing(ImageOutput(IMG))
For y = 0 To DimY-1
For x = 0 To DimX-1
R.f = Red(TabPixel(x,y))
V.f = Green(TabPixel(x,y))
B.f = Blue (TabPixel(x,y))
; algo de trie à optimiser ici
If R + V + B < ValMAX * 3
R = $FFFFFF
V = $FFFFFF
B = $FFFFFF
Opti+1
EndIf
Color = RGB(R,V,B)
; Debug color
Plot(x,y, Color )
Next x
Next y
Debug "il y a eu "+ Str(opti) + " pixels de changés sur " + Str(NBP)
StopDrawing()
Debug "OK"
EndProcedure
If OpenWindow(9, 0, 0, 800, 501, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(10, 0, 0, 359, 323, ImageID(0))
ImageGadget(11, 360, 0, 359, 323, ImageID(0))
ButtonGadget(12,0,641,150,20,"CLIC")
StockPixelTab(0)
Dessine(1,70)
SetGadgetState(11, ImageID(1))
Repeat
Event = WaitWindowEvent()
EG = EventGadget()
Until Event = #PB_Event_CloseWindow
EndIf
Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 21:15
par Ekim
@Ar-S oui merci pour ton code, c'est presque ça je vais dès à présent tenter de terminer le reste
et au lieu de créer un tableau, je vais plutôt essayer de redessiner directement une autre image histoire de gagner
du temps process

Re: 2DDrawing AlphaBlend
Publié : sam. 22/juin/2019 21:59
par Ar-S
au lieu de créer un tableau
Je ne suis pas sûr que sans "lire" les composantes des pixels tu puisses faire grand chose. Le stockage en tableau ne prend pas trop de temps. C'est le "plot" qui prend du temps (enfin façon de parler). Et puis là je n'ai pas désactiver le debog.
Enfin si tu arrives a le faire, n'hésite pas à partager ta technique.
Re: 2DDrawing AlphaBlend
Publié : dim. 23/juin/2019 8:55
par venom
Oui hésite pas à partager.
Regarde ce code. Je m'amuse a transformer une image en noir et blanc (pas niveau de gris) j'utilise un tableau, forcément pour les grosses images ça prend un certin temps.
@++
Re: 2DDrawing AlphaBlend
Publié : dim. 23/juin/2019 20:03
par Ekim
Salut @Venom
Arrg je n'y arrive pas, pourtant en définitive je voudrais seulement remplacer les pixels clairs par un cyan pure RGB(0,255,255)

Re: 2DDrawing AlphaBlend
Publié : dim. 23/juin/2019 20:40
par Ollivier
Ça commence avec :
<< Salut les gars, j'aimerais changer du sombre en transparent ! >>
Et ça se termine par :
<< Salut les gars, j'aimerais changer du clair en cyan ! >>
Eh : quand t'auras les idées fixes, tu rajouteras << C'est mon dernier mot Jean-Pierre... >> et on te feras ça. Normalement, il y a pas mal de trucs qui se font sans aller au pixel près. T'inquiète pas : on va pas te demander un chèque.
Re: 2DDrawing AlphaBlend
Publié : dim. 23/juin/2019 22:18
par Ekim
Bien observé mais tu n'es pas un psy pour autant)))
en fait je cherchais un moyen de contourner le problème, c'est à dire, poser un transparent sur un box cyan pour simuler l'éffet recherché puis aussi (franchement) éviter une "usine à gaz"
