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 :oops:

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é :cry:

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 :lol:

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 :cry:

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
Image

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 :P
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 :D

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)
:x

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" :lol: