PB transparence non voulue
Publié : sam. 22/oct./2016 17:27
Salut à tous 
J'ai essayé cet aprém d'imiter l'effet de parasite ou de brouillage qu'il y a sur l'écran de chargement des maps dans les Battlefields (3 et 4)... cet effet se compose d'un décalage vers la droite des composantes bleues d'une image et vers la gauche pour les composantes rouges... C'est comme si on prenait une image, qu'on isole sur des calques les canaux rouge, vert et bleu, et qu'ensuite on fait glisser les calques les uns sur les autres.
En principe ca marche trés bien, et le petit code que j'ai fait aussi... A un détail prés :
) :
je suppose que c'est de la faute de DrawAlphaImage() mais je vois pas bien où se trouve le bug... Surement entre la chaise et le clavier comme d'hab 

J'ai essayé cet aprém d'imiter l'effet de parasite ou de brouillage qu'il y a sur l'écran de chargement des maps dans les Battlefields (3 et 4)... cet effet se compose d'un décalage vers la droite des composantes bleues d'une image et vers la gauche pour les composantes rouges... C'est comme si on prenait une image, qu'on isole sur des calques les canaux rouge, vert et bleu, et qu'ensuite on fait glisser les calques les uns sur les autres.
En principe ca marche trés bien, et le petit code que j'ai fait aussi... A un détail prés :
- Ceci est l'image d'origine :
Normalement losqu'on décompose cette image selon 3 canaux (un R, un G et un B), on devrait avoir sur chacun les composantes R,G ou B de chaque pixel, comme ceci :
Ici on voit bien que le rouge pur (FFFFFF) n'est présent que sur le calque rouge, normal, il ne contient rien d'autre. Et il est bien rouge (RGB 255,255,255). Il en est de même pour les autres couleurs sur les autres calques. Le rectangle blanc lui est présent sur chacun des calques, avec une intensité maximale. Normal aussi... Mais alors, quand on superpose les 3 calques, le blanc devrait bien être blanc( 255 rouge + 255 vert + 255 bleu)? Et bin... - Ceci est l'image lorsque les 3 calques sont superposés dans mon application (une fois sur un fond noir, une autre sur fond blanc):
Non... le blanc n'est pas blanc... En fait il reste trop de bleu par rapport au reste et pas assez de couleur en tout. Le fond est même visible a travers.

Code : Tout sélectionner
File$ = OpenFileRequester("Choisissez une image","","*.*",0)
Path$ = GetPathPart(File$)
If File$ = ""
End
EndIf
Debug "Chargement..."
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
Enumeration
#Canvas
#Image_red
#Image_green
#Image_blue
#Image_base
#Window
#timer
#ImgX=30
#ImgY=0
#ImgWdth=400
#ImgHgth=400
#MaxDecal = 30
EndEnumeration
Enumeration Channels
#Red
#Green
#Blue
#Alpha
EndEnumeration
Declare ParasiteRGB()
Declare thRGB(param)
Declare SplitChannels(Image,OutputR,OutputG, OutputB)
Declare thSplitChannel(Channel)
Global progress,channel,total, Width, Height, thRed, thBlue, thGreen, Image, OutputR, OutputG, OutputB
OutputR = #Image_red
OutputG = #Image_green
OutputB = #Image_blue
LoadImage(#Image_base,File$)
Debug "Ok ca commence"
OpenWindow(1,0,0,250,30,"Chargement...",#PB_Window_ScreenCentered)
ProgressBarGadget(1,10,5,230,20,0,1000)
SplitChannels(#Image_base, #Image_red, #Image_green, #Image_blue)
Debug "Threads lancés"
Repeat
WaitWindowEvent(50)
SetGadgetState(1,(progress/total)*1000)
Debug progress
Until Not IsThread(thRed) And Not IsThread(thGreen) And Not IsThread(thBlue)
CloseWindow(1)
;On enregistre le résultat donné pour chaque canal, pour vérifier
SaveImage(#Image_red,Path$ + "tmpR.bmp")
SaveImage(#Image_green,Path$ + "tmpG.bmp")
SaveImage(#Image_blue,Path$ + "tmpB.bmp")
OpenWindow(#Window,0,0,800,800,"Analogic display (BF4)",#PB_Window_ScreenCentered| #PB_Window_SystemMenu)
CanvasGadget(#Canvas,0,0,800,800)
AddWindowTimer(#Window,#Timer,1500)
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Timer And EventTimer() = #timer
ParasiteRGB()
EndIf
Until event = #PB_Event_CloseWindow
Procedure ParasiteRGB()
If Not IsThread(thRGB)
CreateThread(@thRGB(), 1)
Else
Debug "Already running..."
EndIf
EndProcedure
Procedure thRGB(param)
Decal = Random(#MaxDecal,2)
For i= 0 To Decal Step 2
StartDrawing(CanvasOutput(#Canvas))
Box(0,0,800,800,0)
DrawAlphaImage(ImageID(#Image_red),#ImgX+i,#ImgY,(255/3))
DrawAlphaImage(ImageID(#Image_blue),#ImgX-i,#ImgY,(255/3))
DrawAlphaImage(ImageID(#Image_green),#ImgX,#ImgY,(255/3))
StopDrawing()
Delay(1)
Next
For i = Decal To 0 Step -1
StartDrawing(CanvasOutput(#Canvas))
Box(0,0,800,800,0)
DrawAlphaImage(ImageID(#Image_red),#ImgX+i,#ImgY,(255/3))
DrawAlphaImage(ImageID(#Image_blue),#ImgX-i,#ImgY,(255/3))
DrawAlphaImage(ImageID(#Image_green),#ImgX,#ImgY,(255/3))
StopDrawing()
Delay(1)
Next
StartDrawing(CanvasOutput(#Canvas))
;DrawImage(ImageID(#Image_base),#imgX,#ImgY) ;Commenter pour voir simplement la superposition foirée
StopDrawing()
EndProcedure
Procedure SplitChannels(Image,OutputR, OutputG, OutputB)
Debug ~"Canal rouge\t:"+OutputR+"\nCanal vert\t:"+OutputG+"\nCanal bleu\t:"+OutputB
StartDrawing(ImageOutput(Image))
Width = OutputWidth()
Height = OutputHeight()
Depth = OutputDepth()
total = 3*(Width * Height)
CreateImage(OutputR,Width,Height,Depth,0)
CreateImage(OutputG,Width,Height,Depth,0)
CreateImage(OutputB,Width,Height,Depth,0)
Global Dim Color(Width,Height)
channel = 0
For x = 0 To Width-1
For y = 0 To Height-1
Color(x,y) = Point(x,y)
Next
progress +1
Next
StopDrawing()
thRed = CreateThread(@thSplitChannel(),#Red)
thGreen = CreateThread(@thSplitChannel(), #Green)
thBlue = CreateThread(@thSplitChannel(), #Blue)
EndProcedure
Procedure thSplitChannel(Channel)
Select Channel
Case #Red
channel +1
StartDrawing(ImageOutput(OutputR))
For x = 0 To Width-1
For y = 0 To Height-1
Plot(x,y,RGB(Red(Color(x,y)),0,0))
Next
progress +1
Next
StopDrawing()
Case #Green
channel +1
StartDrawing(ImageOutput(OutputG))
For x = 0 To Width-1
For y = 0 To Height-1
Plot(x,y,RGB(0,Green(Color(x,y)),0))
Next
progress +1
Next
StopDrawing()
Case #Blue
channel +1
StartDrawing(ImageOutput(OutputB))
For x = 0 To Width-1
For y = 0 To Height-1
Plot(x,y,RGB(0,0,Blue(Color(x,y))))
Next
progress +1
Next
StopDrawing()
EndSelect
EndProcedure
