Revenons au sujet principal, le flou sur image :
Voila la nouvelle version
Ca donne un flou de bien meilleur qualité et je ne suis plus limité a faire du flou par pixel. je travail ici avec un flou comme sur photoshop.
J'ai fait varier de 0.1 pixel en 0.1 pixel dans mon programme. Avec une limite à 3 pixel.
Mais la limite n'existe pas vraiment, la précision va dépendre du type flottant f et la limite maximal du flou également.
Sinon, il vous faut absolument ma librairie Effect, vous trouverez ca ici :
http://www.lsi-dev.com/index.php?mod=ar ... ires&id=70
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Ajouter un effet de flou à l'image
; Necessite la librairie Effect
Enumeration
#Img
#Barre
#Flou
EndEnumeration
; on charge l'image
UseJPEGImageDecoder()
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)
If Fichier = "" Or LoadImage(#Img, Fichier) = 0
End
EndIf
; récupère la dimension de l'image
ImageX = ImageWidth(#Img)
ImageY = ImageHeight(#Img)
If OpenWindow(0, 0, 0, ImageX, ImageY + 35, "Flou", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ImageGadget(#Img, 0, 0, ImageX, ImageY, ImageID(#Img))
ProgressBarGadget(#Barre, 0, ImageY, ImageX, 20, 0, ImageX)
TextGadget(#Flou, 0, ImageY + 20, ImageX, 15, "Niveau de flou :")
EndIf
; On récupère l'image originale
Dim Image.l(ImageX -1, ImageY - 1) ; Attention pas d'erreur dans la taille
GetImageBits(ImageID(0), @Image())
; une liste pour recevoir l'image finale
Dim Image_Finale.l(ImageX -1, ImageY - 1) ; Attention pas d'erreur dans la taille
; Pré calcul de distance, un peu de géométrie
#Distance_Maxi = 3
Dim Distance.f(#Distance_Maxi, #Distance_Maxi)
For x = 0 To #Distance_Maxi
For y = 0 To #Distance_Maxi
Distance(x, y) = Sqr(x * x + y * y)
Debug "[" + Str(x) + "," + Str(y) + "] = " + StrF(Distance(x, y), 4)
Next
Next
; On initialise le niveau de flou
Flou.f = 0
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget ; si on clique sur le bouton gauche de la souris
Select EventGadget()
Case #Img
; on augmente le niveau de flou
Flou + 0.1
If Flou > #Distance_Maxi
Flou = 0
EndIf
SetGadgetText(#Flou, "Niveau de flou : " + StrF(Flou, 1))
; pour chaque pixel
For x = 0 To ImageX - 1
For y = 0 To ImageY - 1
NbPoint.f = 0
Rouge.f = 0
Vert.f = 0
Bleu.f = 0
; On regarde les pixels autour de ce point
For i = -#Distance_Maxi To #Distance_Maxi
For ii = -#Distance_Maxi To #Distance_Maxi
If x + i >= 0 And x + i < ImageX And y + ii >= 0 And y + ii < ImageY ; Je regarde qu'on est bien sur l'image et pas en dehors
n = Abs(i)
nn = Abs(ii)
If Distance(n, nn) <= Flou
; Le point est totalement dans la distance de flou, je l'ajoute entièrement
NbPoint + 1 ; on ajoute un point complet et la couleur au complet
Rouge + Red(Image(x + i, y + ii))
Vert + Green(Image(x + i, y + ii))
Bleu + Blue(Image(x + i, y + ii))
ElseIf Distance(n, nn) <= Flou + 1
; la, le point n'est pas totalement dans la distance de flou, on va l'ajouter partiellement
Partiel.f = 1 + Flou - Distance(n, nn)
NbPoint + Partiel
Rouge + Red(Image(x + i, y + ii)) * Partiel
Vert + Green(Image(x + i, y + ii)) * Partiel
Bleu + Blue(Image(x + i, y + ii)) * Partiel
EndIf
EndIf
Next
Next
; on a finit de regarder autour, on fait la moyenne pour avoir la couleur finale
Rouge / NbPoint
Vert / NbPoint
Bleu / NbPoint
; on va éviter les erreur de calcul, je vérifie que la couleur ne dépasse pas 255
If Rouge > 255
Rouge = 255
EndIf
If Vert > 255
Vert = 255
EndIf
If Bleu > 255
Bleu = 255
EndIf
Image_Finale(x, y) = RGB(Rouge, Vert, Bleu)
Next
SetGadgetState(#Barre, x) ; On affiche la progression
Next
; On crée l'image
SetImageBits(ImageID(0), @Image_Finale())
; on réaffiche l'image
SetGadgetState(#Img, ImageID(#Img))
EndSelect
EndSelect
Until Event = #WM_CLOSE ; on clique sur la croix, fin du prog
EndIf