Flou sur image

Programmation d'applications complexes
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

mais je vais faire un effort.
Merci, ici c'est une famille, et on a besoin de tous le monde :D
Pour perpetuer ce merveilleux language qui nous apporte tant de bonheur

Enfin surtout de gens comme toi :roll: parce que moi, j'sert à quedal :?
Mais je sais bien balayer les petites miettes de codes que vous laissez si genereusement tomber a votre gueux :D

Depuis que je vous connais, ma vie a changée, et je vous doit beaucoup. 8)
Mais, vous inquietez pas......c'est pas parce que vous m'avez beaucoup donné que j'ai plus faim :D
J'aime bien ce met vert avec plein de petits trucs dedans que je connais pas, je le met dans le panneau jaune, je clique sur la petite roue et mes yeux s'illuminent comme au 14 juillet 8O

Avec vous, j'arrette pas de le dire, c'est noel 365 fois par ans 8)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

:roll:

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
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Flou sur image

Message par blendman »

salut

je me permets de relancer ce sujet, car je réalise en ce moment un petit logiciel de type peinture 2D et ce genre de chose m'intéresse énormément :).

Cependant, j'ai testé avec pb4.60 beta3 ,(et même 4.51) et visiblement, la lib effect ne fonctionne plus.

Il y aurait moyen d'actualiser le dernier code ou de me donner une piste pour cela ?

Encore un grand Merci Le Soldat inconnu, car je trouve beaucoup d'exemple de toi et il me sont très précieux ;). (rotate image, et les exemples de tes sites).

J'en profite pour te demander si je peux les utiliser sur mon logiciel (Animatoon) ?
-voici le lien , j'y ai mis le code :
ttp://www.purebasic.fr/french/viewtopic.php?f=3&t=12067


Encore merci.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Flou sur image

Message par Thyphoon »

tient ça me fait pensé que j'ai eu une idée pour faire des flous ... mais j'ai pas (encore) expérimenté ! mais qui serait peut être plus rapide !
tout simplement en réduisant la taille de l'image original puis en lui redonnant sa taille d'origine ! Qu'en pensez vous ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Flou sur image

Message par blendman »

Thyphoon a écrit :tient ça me fait pensé que j'ai eu une idée pour faire des flous ... mais j'ai pas (encore) expérimenté ! mais qui serait peut être plus rapide !
tout simplement en réduisant la taille de l'image original puis en lui redonnant sa taille d'origine ! Qu'en pensez vous ?
hé, pas bête, ça :)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Flou sur image

Message par SPH »

blendman a écrit :
Thyphoon a écrit :tient ça me fait pensé que j'ai eu une idée pour faire des flous ... mais j'ai pas (encore) expérimenté ! mais qui serait peut être plus rapide !
tout simplement en réduisant la taille de l'image original puis en lui redonnant sa taille d'origine ! Qu'en pensez vous ?
hé, pas bête, ça :)
Ca pixelliserait pas plutot ca ?
Moi, le flou, je le ferais bien en faisant la moyenne des pixels environants :!:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Flou sur image

Message par G-Rom »

SPH a écrit :
blendman a écrit :
Thyphoon a écrit :tient ça me fait pensé que j'ai eu une idée pour faire des flous ... mais j'ai pas (encore) expérimenté ! mais qui serait peut être plus rapide !
tout simplement en réduisant la taille de l'image original puis en lui redonnant sa taille d'origine ! Qu'en pensez vous ?
hé, pas bête, ça :)
Ca pixelliserait pas plutot ca ?
Moi, le flou, je le ferais bien en faisant la moyenne des pixels environants :!:
Exact , si tu transforme une image de 1680x1050 en image de 640x480 et que tu la repasse en 1680x1050 , tu vas avoir de la perte c'est logique , d'ou la pixelisation.
pour le traitement d'image , une simple interpolation entre les pixels suffit à flouté une image ( cherche flou gaussien )
pour l'agrandissement les émulateurs utilise un filtre puissant le hq4x
Répondre