2DDrawing AlphaBlend

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

2DDrawing AlphaBlend

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 2DDrawing AlphaBlend

Message 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)
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 2DDrawing AlphaBlend

Message 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 ?
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 2DDrawing AlphaBlend

Message par Ollivier »

Ah. Et si tu remplace 24 par 32 dans la création de l'image 5 ?
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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:
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: 2DDrawing AlphaBlend

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: 2DDrawing AlphaBlend

Message 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
 

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: 2DDrawing AlphaBlend

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: 2DDrawing AlphaBlend

Message 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.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: 2DDrawing AlphaBlend

Message 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.
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2DDrawing AlphaBlend

Message 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:
Répondre