Quelqu'un m'a demandé une mise a jour de ce code pour faire du flou sur une image :
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Ajouter un effet de flou à l'image
#img = 0
#Barre = 1
; on charge l'image
UseJPEGImageDecoder()
Fichier.s = OpenFileRequester("Ouvrir une image", "", "Image|*.bmp;*.jpg", 1)
If 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 + 20, "Flou", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ImageGadget(#img, 0, 0, ImageX, ImageY, ImageID(#img))
ProgressBarGadget(#Barre, 0, ImageY + 2, ImageX, 18, 0, ImageX)
EndIf
; On récupère l'image
Dim Pixel.l(ImageX, ImageY)
StartDrawing(ImageOutput(#img))
For Px = 0 To ImageX
For Py = 0 To ImageY
Pixel(Px, Py) = Point(Px, Py)
Next
; on fait progresser la barre
SetGadgetState(#Barre, Px)
Next
StopDrawing()
; On initialise le niveau de flou
Niveau = 1
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget ; si on clique sur le bouton gauche de la souris
Select EventGadget()
Case #img
StartDrawing(ImageOutput(#img)) ; on dessine sur l'image
x = 0 ; on se place en x=0 sur l'image
Repeat
y = 0 ; on se place en y=0 sur l'image
Repeat
; on récupère la couleur du point en x et y et alentour
Rouge = 0
Vert = 0
Bleu = 0
NbPixel = 0
For Px = -Niveau To Niveau
For Py = -Niveau To Niveau
If Px + x >= 0 And Px + x < ImageX
If Py + y >= 0 And Py + y < ImageY
; on fait le mélange des couleurs entre le point en x,y et ceux qui sont à sont alentour
Couleur = Pixel(Px + x, Py + y)
Rouge = Rouge + Red(Couleur)
Vert = Vert + Green(Couleur)
Bleu = Bleu + Blue(Couleur)
NbPixel + 1
EndIf
EndIf
Next
Next
; On recalcule la nouvelle couleur
Couleur = RGB(Rouge / NbPixel, Vert / NbPixel, Bleu / NbPixel)
; si la taille du nouveau pixel est positive
Plot(x, y, Couleur) ; on dessine un carré qui fait le nouveau pixel de la même couleur que celle récupéré en x et y
; on se déplace sur l'image en y de la taille d'un pixel
y = y + 1
Until y >= ImageY ; si on a finit la colonne de l'image placé en x
; on se déplace sur l'image en x de la taille d'un pixel
x = x + 1
; on fait progresser la barre
SetGadgetState(#Barre, x)
Until x >= ImageX ; si on a traité toutes les lignes de l'image
StopDrawing()
; on réaffiche l'image
SetGadgetState(#img, ImageID(#img))
; on augmente le niveau de flou
Niveau + 1
EndSelect
EndSelect
Until Event = #WM_CLOSE ; on clique sur la croix, fin du prog
EndIf
Enfin, cette version est quand même très très basique, il y a moyen d'améliorer grandement
Elle ne fait du flou que par zone de pixel (carré 3*3 puis 5*5, etc..), on doit pour voir faire un traitement plus homogene
Je regarde, ca va me distraire

++