Flou Guillossien

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Flou Guillossien

Message par Guillot »

mieux que le flou gaussien, le flou Guillossien !! (ou Guillotien)

j'ai pas pu m'empecher de ramener ma fraise
j'ai adapté aux images la fonction de flou que j'utilise pour mes reliefs et textures dans mes démos 3d

je pense que la méthode est analogue au flou rapide de manababel (cf poste "sos flou gaussien")
(elle est aussi rapide quelque soit la largeur du flou)
elle permet en outre
- utilisation 24 ou 32 bit
- le reglage horizontal et vertical
- bouclé ou non (pour les textures)
- nombre de passe variable de 1 à 3
1 passe : parfois pas très propre
2 passes : impeccable
3 passes : pour les snobes (très proche du flou gaussien (mieux à mon avis))

Code : Tout sélectionner

Procedure ImageBlur(Image,ImageSource,di.w, dj.w,pass=1,loop=0)
    If di=0 And dj=0:ProcedureReturn:EndIf
    Protected i,ii,j,k,d,dii,djj,dx,dy,dij,_dij.f,tx.l, o,p,n
    
    dx = ImageWidth(ImageSource)-1 :If di>dx:di=dx:EndIf
    dy = ImageHeight(ImageSource)-1:If dj>dy:dj=dy:EndIf
    p= ImageDepth(ImageSource)/8
    Dim s.a(dy,(dx+1)*p-1)
    Dim d.a(dy,(dx+1)*p-1)
    StartDrawing(ImageOutput(ImageSource)):CopyMemory(DrawingBuffer(),@s(0,0),(dx+1)*(dy+1)*p):StopDrawing()
    
    dii=di+1
    djj=dj+1
    dij = dii * djj:_dij=1/dij
    
    If loop
        d=dx-dii/2:Dim lx(dx + 2*dii): For i = 0 To dx + 2*dii: lx(i) = (i+d) % (dx+1): Next
        d=dy-djj/2:Dim ly(dy + 2*djj): For i = 0 To dy + 2*djj: ly(i) = (i+d) % (dy+1): Next    
    Else
        Dim lx(dx + 2*dii): For i = 0 To dx + 2*dii:ii=i-1-dii/2:If ii<0:ii=0:ElseIf ii>dx:ii=dx:EndIf: lx(i) = ii: Next
        Dim ly(dy + 2*djj): For i = 0 To dy + 2*djj:ii=i-1-djj/2:If ii<0:ii=0:ElseIf ii>dy:ii=dy:EndIf: ly(i) = ii: Next
    EndIf  
    
    For k=1 To pass
        For o=0 To p-1
            Dim ty.l(dx)
            For j = 0 To djj - 1:ii=o: For i = 0 To dx: ty(i) + s(ly(j),ii):ii+p: Next: Next    
            For j = 0 To dy
                ii=o:For i = 0 To dx: ty(i) + s(ly(djj+j),ii) - s(ly(j),ii):ii+p: Next
                tx=0:For i = 0 To dii-1: tx+ty(lx(i)): Next
                ii=o:For i = 0 To dx: tx + ty(lx(dii+i)) - ty(lx(i) ): d(j,ii) = tx *_dij:ii+p: Next
            Next
        Next
        CopyArray(d(),s())
    Next
    n=CreateImage(Image,dx+1,dy+1,p*8):If Image=-1:Image=n:EndIf
    StartDrawing(ImageOutput(Image)):CopyMemory(@d(0,0),DrawingBuffer(),(dx+1)*(dy+1)*p):StopDrawing()
    ProcedureReturn Image
EndProcedure

OpenWindow(0, 0, 0, 1024, 720, "flou", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

CreateImage(0,1024,700)
LoadFont(0,"Arial",100,#PB_Font_Bold)
StartDrawing(ImageOutput(0))
DrawingFont(FontID(0))
For i=0 To 20:DrawRotatedText(Random(OutputWidth()),Random(OutputHeight()),"FLOU",Random(360),Random($ffffff)):Next
StopDrawing()

n=ImageBlur(#PB_Any,0,20,20,2,0)

StartDrawing(WindowOutput(0))
DrawImage(ImageID(n),0,0)
StopDrawing()

Repeat:Until  WaitWindowEvent()= #PB_Event_CloseWindow
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Flou Guillossien

Message par Ar-S »

Salut Guillot.

415ms pour Guilloniser une photo de 3968x1984 en 2pass
Nickel chrome flouté ! :mrgreen:
~~~~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
Répondre