filtre de dispersion graphique

Programmation d'applications complexes
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

filtre de dispersion graphique

Message par manababel »

bonjour

ce filtre est basé d’après le site suivant
https://23forward.com/Un-filtre-de-dispersion-graphique

pour résumer , vous chargez une image puis une deuxième , qui va déformer la première

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
UseGIFImageDecoder()
; charge une image et la convertie en 32bit
;-------------------------------------------------------------------
Procedure load_image(nom,file$)
  Protected nom_p.i , temps_p.i , x.l , y.l , r.l,g.l,b.l , i.l
  Protected lg.l , ht.l , depth.l , temps.i  , dif.l , dif1.l

  LoadImage(nom,file$)
  If Not IsImage(nom) : ProcedureReturn 0 : EndIf
   
  StartDrawing(ImageOutput(nom))
  Depth=OutputDepth()
  StopDrawing()

  If Depth=24
    CopyImage(nom,temps)
    FreeImage(nom)
    StartDrawing(ImageOutput(temps))
    temps_p = DrawingBuffer()
    lg = ImageWidth(temps)
    ht = ImageHeight(temps)
    dif = DrawingBufferPitch() - (lg*3)
    StopDrawing()
    
  
    CreateImage(nom,lg,ht,32)
    StartDrawing(ImageOutput(nom))
    nom_p = DrawingBuffer()
    StopDrawing()
    
    For y=0 To ht-1
      For x=0 To lg-1
        i = ((y*lg)+x)*3
        r=PeekA(temps_p + i + 2 + dif1)
        g=PeekA(temps_p + i + 1 + dif1)
        b=PeekA(temps_p + i + 0 + dif1)
        PokeL(nom_p + ((y*lg)+x)*4 , r<<16 + g<<8 + b)
      Next
      dif1 = dif1 + dif
    Next
    
    FreeImage(temps) ; supprime l'image 24bits
    
  EndIf

  ProcedureReturn 1
EndProcedure
;------------------------------------------------------------------

Procedure udate(source.i,mappe.i,cible.i,scale.f)
  
  StartDrawing(ImageOutput(source))
  source_p = DrawingBuffer()
  ht1 = ImageHeight(source)
  lg1 = ImageWidth(source)
  StopDrawing()
  
  StartDrawing(ImageOutput(mappe))
  mappe_p = DrawingBuffer()
  StopDrawing()
  
  StartDrawing(ImageOutput(cible))
  cible_p = DrawingBuffer()
  StopDrawing()
  
  
    For y=0 To ht1-1
      For x=0 To lg1-1
        
        pos2 = mappe_p + (((y*lg1)+x) * 4)
        v1 = PeekA(pos2 + 1)
        v2 = PeekA(pos2 + 2)
        
        dx.f = (scale * ( v1 - 127) )
        dy.f = (scale * ( v2 - 127) )
        
        x1 = (x + dx)
        y1 = (y + dy)
        If x1<0 : x1 = 0 : EndIf
        If y1<0 : y1 = 0 : EndIf
        If x1>=lg1 : x1 =  lg1-1 : EndIf
        If y1>=ht1 : y1 =  ht1-1 : EndIf

        pos1 = source_p + (((y1*lg1)+x1) * 4)
        r = PeekA( pos1 + 2)
        g = PeekA( pos1 + 1)
        b = PeekA( pos1 + 0)
        
        pos3 = cible_p + (((y*lg1)+x) * 4)
        PokeA( pos3 + 2 , r)
        PokeA( pos3 + 1 , g)
        PokeA( pos3 + 0 , b)
      Next
    Next
    
EndProcedure


quit=0
If OpenWindow(0, 0, 0, 1000, 800, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateMenu(0, WindowID(0))
    MenuTitle("Load")
    MenuItem( 1, "Load Image")
    MenuItem( 6, "Load map")
   MenuTitle("Save")   
    MenuItem( 2, "Save BMP")
    ;MenuItem( 3, "Save JPG")
    MenuItem( 4, "Save Clipboard")
  MenuTitle("Quit")
    MenuItem( 5, "Quit")
    
    TrackBarGadget(10, 10, 0, 512, 20, 0, 128 )
    

;------------------------------------------------------------
;------------------------------------------------------------      
    
    source = 1
    mappe =2
    cible = 3
    
    Repeat   
    
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 10
             var = GetGadgetState(10)
             scale.f= (var / 100.0)
             If IsImage(1) And IsImage(2) And  IsImage(3)
               udate(source,mappe,cible,scale)
             EndIf
                 
             
          EndSelect
          
        Case #PB_Event_Menu
          
          Select EventMenu()
            Case 1
              If IsImage(source) : FreeImage(source) : EndIf
              If IsImage(mappe) : FreeImage(mappe) : EndIf
              file$ = OpenFileRequester("Image","","",0)
              If Not Load_Image(1,file$)
                MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              EndIf
              CopyImage(source,cible)
            
            Case 6
              If Not IsImage(source)
                MessageRequester("load_image","vous devez charger une image avant",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              Else
                
                If IsImage(mappe) : FreeImage(mappe) : EndIf
                file$ = OpenFileRequester("Image","","",0)
                If Not Load_Image(mappe,file$)
                  MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
                EndIf
    
                StartDrawing(ImageOutput(source))
                source_p = DrawingBuffer()
                ht1 = ImageHeight(source)
                lg1 = ImageWidth(source)
                StopDrawing()
                ResizeImage(mappe, lg1, ht1)
              EndIf
              
            Case 2
              nom$ = SaveFileRequester("Save BMP", "", "", 0)
              If nom$ <> "" : SaveImage(cible, nom$+".bmp" ,#PB_ImagePlugin_BMP ) : EndIf
              
            
            Case 5
              quit = 1
              
          EndSelect
          
      EndSelect
      
      
      StartDrawing(WindowOutput(0))
      If IsImage(cible) : DrawImage(ImageID(cible),0,20) : EndIf
      StopDrawing()
      
              
   Until Event = #PB_Event_CloseWindow Or quit=1
 EndIf
End
Dernière modification par manababel le dim. 28/févr./2021 7:45, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: filtre de dispersion graphique

Message par Kwai chang caine »

Tu va rire :mrgreen: ça plantait
Alors j'ai essayé de rajouter

Code : Tout sélectionner

UsePNGImageDecoder()
UseJPEGImageDecoder()
et ça marche :D

Ca fait un truc "zarebi" ce mélange, je pense que ça a surement une utilité autre que de faire ça
Mais ça a l'air de marcher ici

Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
venom
Messages : 3136
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: filtre de dispersion graphique

Message par venom »

Bravo KCC.

C'est par ce que d'origine le code doit sûrement ouvrir un bmp. :wink:








@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: filtre de dispersion graphique

Message par manababel »

dsl , c'est une erreur de copié/collé , un oubli des lib images ( c'est modifié )

voici une nouvelle version

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
UseGIFImageDecoder()

; charge une image et la convertie en 32bit
;-------------------------------------------------------------------
Procedure load_image(nom,file$)
  Protected nom_p.i , temps_p.i , x.l , y.l , r.l,g.l,b.l , i.l
  Protected lg.l , ht.l , depth.l , temps.i  , dif.l , dif1.l

  LoadImage(nom,file$)
  If Not IsImage(nom) : ProcedureReturn 0 : EndIf
   
  StartDrawing(ImageOutput(nom))
  Depth=OutputDepth()
  StopDrawing()

  If Depth=24
    CopyImage(nom,temps)
    FreeImage(nom)
    StartDrawing(ImageOutput(temps))
    temps_p = DrawingBuffer()
    lg = ImageWidth(temps)
    ht = ImageHeight(temps)
    dif = DrawingBufferPitch() - (lg*3)
    StopDrawing()
    
  
    CreateImage(nom,lg,ht,32)
    StartDrawing(ImageOutput(nom))
    nom_p = DrawingBuffer()
    StopDrawing()
    
    For y=0 To ht-1
      For x=0 To lg-1
        i = ((y*lg)+x)*3
        r=PeekA(temps_p + i + 2 + dif1)
        g=PeekA(temps_p + i + 1 + dif1)
        b=PeekA(temps_p + i + 0 + dif1)
        PokeL(nom_p + ((y*lg)+x)*4 , r<<16 + g<<8 + b)
      Next
      dif1 = dif1 + dif
    Next
    
    FreeImage(temps) ; supprime l'image 24bits
    
  EndIf

  ProcedureReturn 1
EndProcedure
;------------------------------------------------------------------

Procedure udate(source.i , mappe.i , cible.i , scale.f , opt=0)
  
  StartDrawing(ImageOutput(source))
  source_p = DrawingBuffer()
  ht1 = ImageHeight(source)
  lg1 = ImageWidth(source)
  StopDrawing()
  
  StartDrawing(ImageOutput(mappe))
  mappe_p = DrawingBuffer()
  ht2 = ImageHeight(mappe)
  lg2 = ImageWidth(mappe)
  StopDrawing()
  scalex.f = Abs(lg2/lg1)
  scaley.f = Abs(ht2/ht1)
  
  StartDrawing(ImageOutput(cible))
  cible_p = DrawingBuffer()
  StopDrawing()
  
  
    For y=0 To ht1-1
      For x=0 To lg1-1
        
        If opt = 0
          x1 = Mod(x,(lg2-1))
          y1 = Mod(y,(ht2-1))
        Else
          x1 = x * scalex
          y1 = y * scaley
          If x1>=lg2 : x1=lg2-1 : EndIf
          If y1>=ht2 : y1=ht2-1 : EndIf
        EndIf
        
        pos2 = mappe_p + (((y1*lg2)+x1) << 2)
        v1 = PeekA(pos2 + 1)
        v2 = PeekA(pos2 + 2)
        
        dx.f = (scale * ( v1 - 127) )
        dy.f = (scale * ( v2 - 127) )
        
        x1 = (x + dx)
        y1 = (y + dy)
        If x1<0 : x1 = 0 : EndIf
        If y1<0 : y1 = 0 : EndIf
        If x1>=lg1 : x1 =  lg1-1 : EndIf
        If y1>=ht1 : y1 =  ht1-1 : EndIf

        pos1 = (((y1*lg1)+x1) << 2)
        pos3 = (((y*lg1)+x) << 2)
        rgb = PeekL( source_p + pos1)
        PokeL( cible_p + pos3 , rgb )
        
      Next
    Next
    
EndProcedure


quit=0
If OpenWindow(0, 0, 0, 1000, 800, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateMenu(0, WindowID(0))
    MenuTitle("Load")
    MenuItem( 1, "Load Image")
    MenuItem( 6, "Load map")
   MenuTitle("Save")   
    MenuItem( 2, "Save BMP")
    ;MenuItem( 3, "Save JPG")
    MenuItem( 4, "Save Clipboard")
  MenuTitle("option")
  MenuItem( 7, "none")
  MenuItem( 8, "scale")
  MenuTitle("Quit")
    MenuItem( 5, "Quit")
    
    TrackBarGadget(10, 10, 0, 512, 20, 0, 128 )
    

;------------------------------------------------------------
;------------------------------------------------------------      
    
    source = 1
    mappe = 2
    cible = 3
    
    Repeat   
    
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 10
             var = GetGadgetState(10)
             scale.f= (var / 100.0)
             If IsImage(1) And IsImage(2) And  IsImage(3)
               udate(source,mappe,cible,scale,opt)
             EndIf
                 
             
          EndSelect
          
        Case #PB_Event_Menu
          
          Select EventMenu()
            Case 1
              If IsImage(source) : FreeImage(source) : EndIf
              If IsImage(mappe) : FreeImage(mappe) : EndIf
              file$ = OpenFileRequester("Image","","",0)
              If Not Load_Image(1,file$)
                MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              EndIf
              CopyImage(source,cible)
            
            Case 6
              If Not IsImage(source)
                MessageRequester("load_image","vous devez charger une image avant",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              Else
                
                If IsImage(mappe) : FreeImage(mappe) : EndIf
                file$ = OpenFileRequester("Image","","",0)
                If Not Load_Image(mappe,file$)
                  MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
                EndIf
    
              EndIf
              
            Case 2
              nom$ = SaveFileRequester("Save BMP", "", "", 0)
              If nom$ <> "" : SaveImage(cible, nom$+".bmp" ,#PB_ImagePlugin_BMP ) : EndIf
              
            
            Case 5
              quit = 1
              
            Case 7
              opt = 0
              If IsImage(1) And IsImage(2) And  IsImage(3)
                udate(source,mappe,cible,scale,opt)
             EndIf
                
            Case 8
              opt = 1
              If IsImage(1) And IsImage(2) And  IsImage(3)
                udate(source,mappe,cible,scale,opt)
             EndIf
              
          EndSelect
          
      EndSelect
      
      
      StartDrawing(WindowOutput(0))
      If IsImage(cible) : DrawImage(ImageID(cible),0,20) : EndIf
      StopDrawing()
      
              
   Until Event = #PB_Event_CloseWindow Or quit=1
 EndIf
End
pour les images ( map ) , utilisez des image avec des motifs respectifs style "normal mapping"
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: filtre de dispersion graphique

Message par Mesa »

J'ai ajouté un scollarea pour les grandes images.

Code : Tout sélectionner

UseJPEGImageDecoder() 
UseJPEG2000ImageDecoder() 
UsePNGImageDecoder() 
UseTGAImageDecoder() 
UseTIFFImageDecoder() 
UseGIFImageDecoder() 

; charge une image et la convertie en 32bit 
;------------------------------------------------------------------- 
Procedure load_image(nom,file$) 
  Protected nom_p.i , temps_p.i , x.l , y.l , r.l,g.l,b.l , i.l 
  Protected lg.l , ht.l , depth.l , temps.i  , dif.l , dif1.l 
  
  LoadImage(nom,file$) 
  If Not IsImage(nom) : ProcedureReturn 0 : EndIf 
  
  StartDrawing(ImageOutput(nom)) 
  Depth=OutputDepth() 
  StopDrawing() 
  
  If Depth=24 
    CopyImage(nom,temps) 
    FreeImage(nom) 
    StartDrawing(ImageOutput(temps)) 
    temps_p = DrawingBuffer() 
    lg = ImageWidth(temps) 
    ht = ImageHeight(temps) 
    dif = DrawingBufferPitch() - (lg*3) 
    StopDrawing() 
    
    
    CreateImage(nom,lg,ht,32) 
    StartDrawing(ImageOutput(nom)) 
    nom_p = DrawingBuffer() 
    StopDrawing() 
    
    For y=0 To ht-1 
      For x=0 To lg-1 
        i = ((y*lg)+x)*3 
        r=PeekA(temps_p + i + 2 + dif1) 
        g=PeekA(temps_p + i + 1 + dif1) 
        b=PeekA(temps_p + i + 0 + dif1) 
        PokeL(nom_p + ((y*lg)+x)*4 , r<<16 + g<<8 + b) 
      Next 
      dif1 = dif1 + dif 
    Next 
    
    FreeImage(temps) ; supprime l'image 24bits 
    
  EndIf 
  
  ProcedureReturn 1 
EndProcedure 
;------------------------------------------------------------------ 

Procedure udate(source.i , mappe.i , cible.i , scale.f , opt=0) 
  
  StartDrawing(ImageOutput(source)) 
  source_p = DrawingBuffer() 
  ht1 = ImageHeight(source) 
  lg1 = ImageWidth(source) 
  StopDrawing() 
  
  StartDrawing(ImageOutput(mappe)) 
  mappe_p = DrawingBuffer() 
  ht2 = ImageHeight(mappe) 
  lg2 = ImageWidth(mappe) 
  StopDrawing() 
  scalex.f = Abs(lg2/lg1) 
  scaley.f = Abs(ht2/ht1) 
  
  StartDrawing(ImageOutput(cible)) 
  cible_p = DrawingBuffer() 
  StopDrawing() 
  
  
  For y=0 To ht1-1 
    For x=0 To lg1-1 
      
      If opt = 0 
        x1 = Mod(x,(lg2-1)) 
        y1 = Mod(y,(ht2-1)) 
      Else 
        x1 = x * scalex 
        y1 = y * scaley 
        If x1>=lg2 : x1=lg2-1 : EndIf 
        If y1>=ht2 : y1=ht2-1 : EndIf 
      EndIf 
      
      pos2 = mappe_p + (((y1*lg2)+x1) << 2) 
      v1 = PeekA(pos2 + 1) 
      v2 = PeekA(pos2 + 2) 
      
      dx.f = (scale * ( v1 - 127) ) 
      dy.f = (scale * ( v2 - 127) ) 
      
      x1 = (x + dx) 
      y1 = (y + dy) 
      If x1<0 : x1 = 0 : EndIf 
      If y1<0 : y1 = 0 : EndIf 
      If x1>=lg1 : x1 =  lg1-1 : EndIf 
      If y1>=ht1 : y1 =  ht1-1 : EndIf 
      
      pos1 = (((y1*lg1)+x1) << 2) 
      pos3 = (((y*lg1)+x) << 2) 
      rgb = PeekL( source_p + pos1) 
      PokeL( cible_p + pos3 , rgb ) 
      
    Next 
  Next 
  
EndProcedure 


quit=0 
windoww=1024
windowh=768
If OpenWindow(0, 0, 0, 1024, 768, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  
  CreateMenu(0, WindowID(0)) 
  MenuTitle("Load") 
  MenuItem( 1, "Load Image") 
  MenuItem( 6, "Load map") 
  MenuTitle("Save")    
  MenuItem( 2, "Save BMP") 
  ;MenuItem( 3, "Save JPG") 
  MenuItem( 4, "Save Clipboard") 
  MenuTitle("option") 
  ; 		MenuItem( 7, "none") 
  MenuItem( 8, "scale") 
  MenuTitle("Quit") 
  MenuItem( 5, "Quit") 
  
  TrackBarGadget(10, 10, 0, 512, 20, 0, 128 ) 
  ScrollAreaGadget(11,0,MenuHeight()+GadgetHeight(10)+0,
                   1020,windowh-MenuHeight()-GadgetHeight(10)-50,32000,32000)
  CanvasGadget(12,0,0,windoww,windoww)
  CloseGadgetList()
  ; 			SetWindowState(0,#PB_Window_Maximize)
  ;------------------------------------------------------------ 
  ;------------------------------------------------------------  
  
  source = 1 
  mappe = 2 
  cible = 3 
  
  Repeat    
    
    Event = WaitWindowEvent() 
    
    Select Event 
        
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case 10 
            var = GetGadgetState(10) 
            scale.f= (var / 100.0) 
            If IsImage(1) And IsImage(2) And  IsImage(3) 
              udate(source,mappe,cible,scale,opt) 
              StartDrawing(CanvasOutput(12))
              If IsImage(cible) 
                
                DrawImage(ImageID(cible),0,0) 
                
              EndIf 
              StopDrawing() 
            EndIf 
            
            
        EndSelect 
        
      Case #PB_Event_Menu 
        
        Select EventMenu() 
          Case 1 
            If IsImage(source) : FreeImage(source) : EndIf 
            If IsImage(mappe) : FreeImage(mappe) : EndIf 
          file$ = OpenFileRequester("Image","","",0) 
           
            If file$
              If Not Load_Image(1,file$) 
                MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
              EndIf 
              CopyImage(source,cible)
              iw=ImageWidth(cible)
              ih=ImageHeight(cible)
              If iw>GadgetWidth(11)
                x=0
              Else
                x=(GadgetWidth(11)-iw)/2
                
              EndIf
              If ih>GadgetHeight(11)
                y=0
              Else
                
                y=(GadgetHeight(11)-ih)/2
              EndIf
              ResizeGadget(12,x,y,iw,ih)
              StartDrawing(CanvasOutput(12))
              If IsImage(cible) 
                
                DrawImage(ImageID(cible),0,0) 
                
              EndIf 
              StopDrawing() 
              
            EndIf
            
          Case 6 
            If Not IsImage(source) 
              MessageRequester("load_image","vous devez charger une image avant",#PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
            Else 
              
              If IsImage(mappe) : FreeImage(mappe) : EndIf 
              file$ = OpenFileRequester("Image","","",0) 
              
              If file$
                If Not Load_Image(mappe,file$) 
                  MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
                EndIf 
              EndIf
            EndIf 
            
          Case 2 
            nom$ = SaveFileRequester("Save BMP", "", "", 0) 
            If nom$ <> "" : SaveImage(cible, nom$+".bmp" ,#PB_ImagePlugin_BMP ) : EndIf 
            
            
          Case 5 
            quit = 1 
            
            ; 							Case 7 
            ; 								opt = 0 
            ; 								If IsImage(1) And IsImage(2) And  IsImage(3) 
            ; 									udate(source,mappe,cible,scale,opt) 
            ; 								EndIf 
            
          Case 8 
            If GetMenuItemState(0,8)
              SetMenuItemState(0,8,#False)
              opt = 0 
              
            Else
              
              SetMenuItemState(0,8,#True)
              opt = 1
            EndIf
            
            If IsImage(1) And IsImage(2) And  IsImage(3) 
              udate(source,mappe,cible,scale,opt) 
            EndIf 
            
        EndSelect 
        
    EndSelect 
    
    
    
    
    
  Until Event = #PB_Event_CloseWindow Or quit=1 
EndIf 
End
M.
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: filtre de dispersion graphique

Message par manababel »

Merci Mesa
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: filtre de dispersion graphique

Message par blendman »

salut, j'ai testé mais j'ai un bug, l'image finale se décale en X et Y , plus j'accentue le filtre :

Image

Comme image map, j'ai utilisé une simple image d'un scan de papier aquarelle.

une idée du soucis ?

merci en tout ça ;).
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: filtre de dispersion graphique

Message par manababel »

Bonjour Blendman

Non , ce n'est pas un bug , c'est meme le but de ce programme.

Essayez avec des images de type "normal mapping" ou "normal map textures" dans l'option "load mappe"
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: filtre de dispersion graphique

Message par kernadec »

bjr manababel
merci, pour partage
Passage du code en EnableExplicit
avec l' Enumeration #Filtre

petite modif:
En utilisant Scale avant le menu "Load Image" elle seras à la taille de la fenêtre
sinon l' image seras chargée dans sa taille
Cordialement

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
UseGIFImageDecoder()

EnableExplicit

Enumeration
  #Filtre_Window
  #Filtre_Canvas
  #Filtre_TrackBar
  #Filtre_ScrolBar
EndEnumeration

Enumeration
  #Filtre_Menu
  #Filtre_MenuItem_1
  #Filtre_MenuItem_2
  #Filtre_MenuItem_3
  #Filtre_MenuItem_4
  #Filtre_MenuItem_5
  #Filtre_MenuItem_6
  #Filtre_MenuItem_7
  #Filtre_MenuItem_8
EndEnumeration

Enumeration 1
  #Filtre_Image_1
  #Filtre_Image_2
  #Filtre_Image_3
EndEnumeration

Global quit = 0
Global windoww = 1024
Global windowh = 768
Global event, x, y, source.i, cible.i, mappe.i, opt, var, Echelle = 0
Global scale.f, scalex.f ,scaley.f
Global file$, nom$

; charge une image et la convertie en 32bit
;-------------------------------------------------------------------
Procedure load_image(nom,file$,echelle)
  Protected nom_p.i , temps_p.i , x.l , y.l , r.l,g.l,b.l , i.l
  Protected depth.l , temps.i  , dif.l , dif1.l
  
  LoadImage(nom,file$)
  If Not IsImage(nom) : ProcedureReturn 0 : EndIf
  If echelle = 1
    ResizeImage(nom,WindowWidth(#Filtre_Window),WindowHeight(#Filtre_Window))
  EndIf
  
  StartDrawing(ImageOutput(nom))
  Depth=OutputDepth()
  StopDrawing()
  
  If Depth = 24
    CopyImage(nom,temps)
    FreeImage(nom)
    StartDrawing(ImageOutput(temps))
    temps_p = DrawingBuffer()
    dif = DrawingBufferPitch() - (ImageWidth(temps) * 3)
    StopDrawing()
    
    CreateImage(nom, ImageWidth(temps), ImageHeight(temps), 32)
    StartDrawing(ImageOutput(nom))
    nom_p = DrawingBuffer()
    StopDrawing()
    
    For y = 0 To ImageHeight(temps) - 1
      For x = 0 To ImageWidth(temps) - 1
        i = (( y * ImageWidth(temps) ) + x) * 3
        r = PeekA(temps_p + i + 2 + dif1)
        g = PeekA(temps_p + i + 1 + dif1)
        b = PeekA(temps_p + i + 0 + dif1)
        PokeL(nom_p + ((y * ImageWidth(temps)) + x) * 4, r << 16 + g << 8 + b)
      Next
      dif1 = dif1 + dif
    Next
    
    FreeImage(temps) ; supprime l'image 24bits
  EndIf
  
  ProcedureReturn 1
EndProcedure
;------------------------------------------------------------------

Procedure Update(source.i , mappe.i , cible.i , scale.f , opt = 0)
  Protected ht1, ht2, lg1, lg2, x, y, x1, y1, v1, v2, pos1, pos2, pos3, rgb, dx.f, dy.f
  Protected mappe_p.i, source_p.i, cible_p.i
  
  StartDrawing(ImageOutput(source))
  source_p = DrawingBuffer()
  ht1 = ImageHeight(source)
  lg1 = ImageWidth(source)
  StopDrawing()
  
  StartDrawing(ImageOutput(mappe))
  mappe_p = DrawingBuffer()
  ht2 = ImageHeight(mappe)
  lg2 = ImageWidth(mappe)
  StopDrawing()
  scalex.f = Abs(lg2/lg1)
  scaley.f = Abs(ht2/ht1)
  
  StartDrawing(ImageOutput(cible))
  cible_p = DrawingBuffer()
  StopDrawing()
  
  
  For y = 0 To ht1 - 1
    For x = 0 To lg1 - 1
      
      If opt = 0
        x1 = Mod(x,(lg2 - 1))
        y1 = Mod(y,(ht2 - 1))
      Else
        x1 = x * scalex
        y1 = y * scaley
        If x1 >= lg2 : x1 = lg2 - 1 : EndIf
        If y1 >= ht2 : y1 = ht2 - 1 : EndIf
      EndIf
      
      pos2 = mappe_p + (((y1*lg2)+x1) << 2)
      v1 = PeekA(pos2 + 1)
      v2 = PeekA(pos2 + 2)
      
      dx.f = (scale * ( v1 - 127) )
      dy.f = (scale * ( v2 - 127) )
      
      x1 = (x + dx)
      y1 = (y + dy)
      If x1 <0 : x1 = 0 : EndIf
      If y1 <0 : y1 = 0 : EndIf
      If x1 >= lg1 : x1 =  lg1-1 : EndIf
      If y1 >= ht1 : y1 =  ht1-1 : EndIf
      
      pos1 = (((y1 * lg1) + x1) << 2)
      pos3 = (((y * lg1) + x) << 2)
      rgb = PeekL( source_p + pos1)
      PokeL( cible_p + pos3 , rgb )
      
    Next
  Next
  
EndProcedure



If OpenWindow(#Filtre_Window, 0, 0, 1024, 768, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateMenu(#Filtre_Menu, WindowID(#Filtre_Window))
  MenuTitle("Load")
  MenuItem(#Filtre_MenuItem_1, "Load Image")
  MenuItem(#Filtre_MenuItem_6, "Load map")
  MenuTitle("Save")   
  MenuItem(#Filtre_MenuItem_2, "Save BMP")
  ;MenuItem( 3, "Save JPG")
  MenuItem(#Filtre_MenuItem_4, "Save Clipboard")
  MenuTitle("option")
  ;       MenuItem( 7, "none")
  MenuItem(#Filtre_MenuItem_8, "scale")
  MenuTitle("Quit")
  MenuItem(#Filtre_MenuItem_5, "Quit")
  
  TrackBarGadget(#Filtre_TrackBar, 10, 0, 512, 20, 0, 128 )
  ScrollAreaGadget(#Filtre_ScrolBar, 0, MenuHeight() + GadgetHeight(#Filtre_TrackBar) + 0,   
                   1020, WindowHeight(#Filtre_Window) - MenuHeight() - GadgetHeight(#Filtre_TrackBar)-50,32000,32000)
  CanvasGadget(#Filtre_Canvas, 0, 0, WindowWidth(#Filtre_Window),WindowHeight(#Filtre_Window))
  CloseGadgetList()
  ;          SetWindowState(0,#PB_Window_Maximize)
  ;------------------------------------------------------------
  ;------------------------------------------------------------
  
  source = 1
  mappe = 2
  cible = 3
  
  Repeat   
    
    Event = WaitWindowEvent()
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Filtre_TrackBar
            var = GetGadgetState(#Filtre_TrackBar)
            scale.f= (var / 100.0)
            If IsImage(#Filtre_Image_1) And IsImage(#Filtre_Image_2) And  IsImage(#Filtre_Image_3)
              Update(source,mappe,cible,scale,opt)
              
              StartDrawing(CanvasOutput(#Filtre_Canvas))
              If IsImage(cible) : DrawImage(ImageID(cible), 0, 0) : EndIf
              StopDrawing()
            EndIf
            
            
        EndSelect
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
          Case #Filtre_MenuItem_1
            
            If IsImage(source) : FreeImage(source) : EndIf
            If IsImage(mappe) : FreeImage(mappe) : EndIf
            
            file$ = OpenFileRequester("Image", "", "", 0)
            If file$
              
              If Not Load_Image(1, file$, Echelle)
                MessageRequester("load_image", "erreur de chargement", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
              EndIf
              
              CopyImage(source,cible)
              
              If WindowWidth(#Filtre_Window) > GadgetWidth(#Filtre_ScrolBar)
                x = 0
              Else
                x=(GadgetWidth(#Filtre_ScrolBar) - ImageWidth(cible)) / 2
              EndIf
              
              If ImageHeight(cible) > GadgetHeight(#Filtre_ScrolBar)
                y = 0
              Else
                y = (GadgetHeight(#Filtre_ScrolBar) - ImageHeight(cible)) / 2
              EndIf
              
              ResizeGadget(#Filtre_Canvas,x,y, ImageWidth(cible), ImageHeight(cible))
              
              StartDrawing(CanvasOutput(#Filtre_Canvas))
              If IsImage(cible) : DrawImage(ImageID(cible),0,0) : EndIf
              StopDrawing()
              
            EndIf
            
          Case #Filtre_MenuItem_6
            
            If Not IsImage(source)
              MessageRequester("load_image","vous devez charger une image avant",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
            Else
              
              If IsImage(mappe) : FreeImage(mappe) : EndIf
              file$ = OpenFileRequester("Image","","",0)
              
              If file$
                If Not Load_Image(mappe,file$, Echelle)
                  MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
                EndIf
              EndIf
            EndIf
            
          Case #Filtre_MenuItem_2
            
            nom$ = SaveFileRequester("Save BMP", "", "", 0)
            If nom$ <> "" : SaveImage(cible, nom$ + ".bmp", #PB_ImagePlugin_BMP ) : EndIf
            
            
          Case #Filtre_MenuItem_5
            
            quit = 1
            
            ;                      Case 7
            ;                         opt = 0
            ;                         If IsImage(1) And IsImage(2) And  IsImage(3)
            ;                            Update(source,mappe,cible,scale,opt)
            ;                         EndIf
            
          Case #Filtre_MenuItem_8
            
            If GetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8)
              SetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8,#False)
              opt = 0
              Echelle = 0
            Else
              SetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8,#True)
              opt = 1
              Echelle = 1
            EndIf
            
            If IsImage(#Filtre_Image_1) And IsImage(#Filtre_Image_2) And  IsImage(#Filtre_Image_3)
              Update(source, mappe, cible, scale, opt)
            EndIf
            
        EndSelect   
    EndSelect   
  Until Event = #PB_Event_CloseWindow Or quit=1
EndIf
End
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: filtre de dispersion graphique

Message par blendman »

manababel a écrit :Bonjour Blendman

Non , ce n'est pas un bug , c'est meme le but de ce programme.

Essayez avec des images de type "normal mapping" ou "normal map textures" dans l'option "load mappe"
Salut manalabel

Effectivement, avec une image de type normalmap, il n'y a plus le décalage.

Dis-moi, je peux inclure ton code dans mon application animatoon, ce serait un filtre "dispersion", et un paramètre de l'outil "pinceau". J'aimerais l'utiliser pour ajouter une sorte de "grain de déformation" à la peinture (comme le grain du papier ou d'une toile a une influence sur la peinture (acrylique ou aquarelle) : en gros, quand on peint, ça prendrait la texture du papier (ou une texture qu'on choisit) pour déformer un peu la peinture (en fonction d'une intensité qu'on pourrait règler aussi).
je ne sais pas encore comment faire ça, car j'appliquerai le filtre en temps réel, sur le coup de pinceau.

Encore merci, j'ai hâte de voir tes prochain filtres ;)

EDIT : j'ai fait des tests avancés, et je trouve que le filtre fonctionne mieux avec des images en niveau de gris qu'avec des image normalmap.

Voici deux tests pour comparer :
Avec une image map en niveau de gris
Image

avec une image map "normalmap":
Image


Autre exemple :
Avec une image map en niveau de gris
Image

avec une image map "normalmap":
Image


Je préfère le premier résultat pour ajouter une sorte de grain.
Le deuxième type (avec normalmap) est sympa, mais ça crée un coté un peu flou de la dispersion. D'ailleurs, l'article dont tu parles dans ton premier message utilise des images en niveau de gris pour faire la dispersion, et je trouve les résultat plus proche quand on utilise une image en niveau de gris..

D'où ma question : comment modifier le code pour ne pas avoir le décalage de l'image avec une image map en niveau de gris, pour pouvoir garder le rendu avec les images en niveau de gris aussi ?

Merci beaucoup :).
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: filtre de dispersion graphique

Message par manababel »

Bonjour

merci Kernadec pour les modif.

vous êtres libres de modifier et d'utiliser tous mes programmes . ( Ce ne sont que des adaptation de programme existant , donc ce ne sont pas vraiment les miens )

Dans le programme , voici la partie qui calcule de déplacement des pixels.

pos2 = mappe_p + (((y1*lg2)+x1) << 2)
v1 = PeekA(pos2 + 1) ; <= on récupéré la composante verte ( +0 = composante bleu )
v2 = PeekA(pos2 + 2) ; <= on récupéré la composante rouge
dx.f = (scale * ( v1 - 127) )
dy.f = (scale * ( v2 - 127) )

vous pouvez modifier par v2=v1 , pour avoir un équivalant d'une image en niveau de gris.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: filtre de dispersion graphique

Message par Mesa »

J'ai vu que le trackbar envoie 2 messages, un pour le clicdown et un pour le clicup ce qui oblige le programme à faire 2 fois le même calcul.
Alors j'ai utilisé un trick pour éviter ça mais du coup le programme ne fonctionne que sous windows.

J'ai ajouté un spingadget pour plus de précision et un trackbar.

Code : Tout sélectionner

UseJPEGImageDecoder() 
UseJPEG2000ImageDecoder() 
UsePNGImageDecoder() 
UseTGAImageDecoder() 
UseTIFFImageDecoder() 
UseGIFImageDecoder() 

EnableExplicit 

Enumeration 
  #Filtre_Window 
  #Filtre_Canvas 
  #Filtre_TrackBar 
  #Filtre_ScrolBar 
  #Filtre_Spin
  #Filtre_Progress
EndEnumeration 

Enumeration 
  #Filtre_Menu 
  #Filtre_MenuItem_1Load_Image 
  #Filtre_MenuItem_2 
  #Filtre_MenuItem_3 
  #Filtre_MenuItem_4 
  #Filtre_MenuItem_5 
  #Filtre_MenuItem_6Load_Map 
  #Filtre_MenuItem_7 
  #Filtre_MenuItem_8 
EndEnumeration 

Enumeration 1 
  #Filtre_Image_1 
  #Filtre_Image_2 
  #Filtre_Image_3 
EndEnumeration 

Global quit = 0 
Global windoww = 1024 
Global windowh = 768 
Global event, x, y, source.i, cible.i, mappe.i, opt, var, Echelle = 0 
Global scale.f, scalex.f ,scaley.f 
Global file$, nom$ 
Global progression

; charge une image et la convertie en 32bit 
;------------------------------------------------------------------- 
Procedure load_image(nom,file$,echelle) 
  Protected nom_p.i , temps_p.i , x.l , y.l , r.l,g.l,b.l , i.l 
  Protected depth.l , temps.i  , dif.l , dif1.l 
  
  LoadImage(nom,file$) 
  If Not IsImage(nom) : ProcedureReturn 0 : EndIf 
  If echelle = 1 
    ResizeImage(nom,WindowWidth(#Filtre_Window),WindowHeight(#Filtre_Window)) 
  EndIf 
  
  StartDrawing(ImageOutput(nom)) 
  Depth=OutputDepth() 
  StopDrawing() 
  
  If Depth = 24 
    CopyImage(nom,temps) 
    FreeImage(nom) 
    StartDrawing(ImageOutput(temps)) 
    temps_p = DrawingBuffer() 
    dif = DrawingBufferPitch() - (ImageWidth(temps) * 3) 
    StopDrawing() 
    
    CreateImage(nom, ImageWidth(temps), ImageHeight(temps), 32) 
    StartDrawing(ImageOutput(nom)) 
    nom_p = DrawingBuffer() 
    StopDrawing() 
    
    For y = 0 To ImageHeight(temps) - 1 
      For x = 0 To ImageWidth(temps) - 1 
        i = (( y * ImageWidth(temps) ) + x) * 3 
        r = PeekA(temps_p + i + 2 + dif1) 
        g = PeekA(temps_p + i + 1 + dif1) 
        b = PeekA(temps_p + i + 0 + dif1) 
        PokeL(nom_p + ((y * ImageWidth(temps)) + x) * 4, r << 16 + g << 8 + b) 
      Next 
      dif1 = dif1 + dif 
    Next 
    
    FreeImage(temps) ; supprime l'image 24bits 
  EndIf 
  
  ProcedureReturn 1 
EndProcedure 
;------------------------------------------------------------------ 

Procedure Update(source.i , mappe.i , cible.i , scale.f , opt = 0) 
  Protected ht1, ht2, lg1, lg2, x, y, x1, y1, v1, v2, pos1, pos2, pos3, rgb, dx.f, dy.f 
  Protected mappe_p.i, source_p.i, cible_p.i 
  
  StartDrawing(ImageOutput(source)) 
  source_p = DrawingBuffer() 
  ht1 = ImageHeight(source) 
  lg1 = ImageWidth(source) 
  StopDrawing() 
  
  StartDrawing(ImageOutput(mappe)) 
  mappe_p = DrawingBuffer() 
  ht2 = ImageHeight(mappe) 
  lg2 = ImageWidth(mappe) 
  StopDrawing() 
  scalex.f = Abs(lg2/lg1) 
  scaley.f = Abs(ht2/ht1) 
  
  StartDrawing(ImageOutput(cible)) 
  cible_p = DrawingBuffer() 
  StopDrawing() 
  
  
  For y = 0 To ht1 - 1 
    For x = 0 To lg1 - 1 
      
      If opt = 0 
        x1 = Mod(x,(lg2 - 1)) 
        y1 = Mod(y,(ht2 - 1)) 
      Else 
        x1 = x * scalex 
        y1 = y * scaley 
        If x1 >= lg2 : x1 = lg2 - 1 : EndIf 
        If y1 >= ht2 : y1 = ht2 - 1 : EndIf 
      EndIf 
      
      pos2 = mappe_p + (((y1*lg2)+x1) << 2) 
      v1 = PeekA(pos2 + 1) 
      v2 = PeekA(pos2 + 2) 
      
      dx.f = (scale * ( v1 - 127) ) 
      dy.f = (scale * ( v2 - 127) ) 
      
      x1 = (x + dx) 
      y1 = (y + dy) 
      If x1 <0 : x1 = 0 : EndIf 
      If y1 <0 : y1 = 0 : EndIf 
      If x1 >= lg1 : x1 =  lg1-1 : EndIf 
      If y1 >= ht1 : y1 =  ht1-1 : EndIf 
      
      pos1 = (((y1 * lg1) + x1) << 2) 
      pos3 = (((y * lg1) + x) << 2) 
      rgb = PeekL( source_p + pos1) 
      PokeL( cible_p + pos3 , rgb ) 
      
    Next
    progression=Int((y/ht1)*100)
    SetGadgetState(#Filtre_Progress, progression)
    ; 			Debug progression
  Next 
  
EndProcedure 



If OpenWindow(#Filtre_Window, 0, 0, 1024, 768, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  
  CreateMenu(#Filtre_Menu, WindowID(#Filtre_Window)) 
  MenuTitle("Load") 
  MenuItem(#Filtre_MenuItem_1Load_Image, "Load Image") 
  MenuItem(#Filtre_MenuItem_6Load_Map, "Load map") 
  MenuTitle("Save")    
  MenuItem(#Filtre_MenuItem_2, "Save BMP") 
  ;MenuItem( 3, "Save JPG") 
  MenuItem(#Filtre_MenuItem_4, "Save Clipboard") 
  MenuTitle("option") 
  ; MenuItem( 7, "none") 
  MenuItem(#Filtre_MenuItem_8, "scale") 
  MenuTitle("Quit") 
  MenuItem(#Filtre_MenuItem_5, "Quit") 
  
  TrackBarGadget(#Filtre_TrackBar, 10, 0, 512, 20, 0, 128 ) 
  SpinGadget(#Filtre_Spin, GadgetX(#Filtre_TrackBar) + GadgetWidth(#Filtre_TrackBar) + 16,
             GadgetY(#Filtre_TrackBar), 60, GadgetHeight(#Filtre_TrackBar),
             0, GetGadgetAttribute(#Filtre_TrackBar, #PB_TrackBar_Maximum), #PB_Spin_Numeric )
  SetGadgetState(#Filtre_Spin,0)
  ProgressBarGadget(#Filtre_Progress,GadgetX(#Filtre_Spin) + GadgetWidth(#Filtre_Spin) + 16,
                    GadgetY(#Filtre_Spin), 160, GadgetHeight(#Filtre_Spin), 0, 100, #PB_ProgressBar_Smooth)
  ScrollAreaGadget(#Filtre_ScrolBar, 0, MenuHeight() + GadgetHeight(#Filtre_TrackBar) + 0,    
                   1020, WindowHeight(#Filtre_Window) - MenuHeight() - GadgetHeight(#Filtre_TrackBar)-50,32000,32000) 
  CanvasGadget(#Filtre_Canvas, 0, 0, WindowWidth(#Filtre_Window),WindowHeight(#Filtre_Window)) 
  CloseGadgetList() 
  ; SetWindowState(0,#PB_Window_Maximize) 
  ;------------------------------------------------------------ 
  ;------------------------------------------------------------ 
  
  source = 1 
  mappe = 2 
  cible = 3 
  
  Repeat    
    
    Event = WaitWindowEvent() 
    
    Select Event 
      Case #WM_LBUTTONUP 
        If GetActiveGadget() = #Filtre_TrackBar 
          var = GetGadgetState(#Filtre_TrackBar) 
          scale.f= (var / 100.0) 
          If IsImage(#Filtre_Image_1) And IsImage(#Filtre_Image_2) And  IsImage(#Filtre_Image_3) 
            Update(source,mappe,cible,scale,opt) 
            
            StartDrawing(CanvasOutput(#Filtre_Canvas)) 
            If IsImage(cible) : DrawImage(ImageID(cible), 0, 0) : EndIf 
            StopDrawing() 
          EndIf 
          SetGadgetState(#Filtre_Spin,GetGadgetState(#Filtre_TrackBar)) 
        EndIf
        
        
      Case #PB_Event_Gadget 
        Select EventGadget()
            
          Case #Filtre_TrackBar
            SetGadgetState(#Filtre_Spin,GetGadgetState(#Filtre_TrackBar))
            
          Case #Filtre_Spin
            SetGadgetState(#Filtre_TrackBar,GetGadgetState(#Filtre_Spin))
            var = GetGadgetState(#Filtre_TrackBar) 
            scale.f= (var / 100.0) 
            If IsImage(#Filtre_Image_1) And IsImage(#Filtre_Image_2) And  IsImage(#Filtre_Image_3) 
              Update(source,mappe,cible,scale,opt) 
              
              StartDrawing(CanvasOutput(#Filtre_Canvas)) 
              If IsImage(cible) : DrawImage(ImageID(cible), 0, 0) : EndIf 
              StopDrawing() 
            EndIf 
            
            
        EndSelect 
        
      Case #PB_Event_Menu 
        
        Select EventMenu() 
            
          Case #Filtre_MenuItem_1Load_Image 
            
            If IsImage(source) : FreeImage(source) : EndIf 
            If IsImage(mappe) : FreeImage(mappe) : EndIf 
            
            file$ = OpenFileRequester("Image", "", "", 0) 
            If file$ 
              
              If Not Load_Image(1, file$, Echelle) 
                MessageRequester("load_image", "erreur de chargement", #PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
              EndIf 
              
              CopyImage(source,cible) 
              
              If WindowWidth(#Filtre_Window) > GadgetWidth(#Filtre_ScrolBar) 
                x = 0 
              Else 
                x=(GadgetWidth(#Filtre_ScrolBar) - ImageWidth(cible)) / 2 
              EndIf 
              
              If ImageHeight(cible) > GadgetHeight(#Filtre_ScrolBar) 
                y = 0 
              Else 
                y = (GadgetHeight(#Filtre_ScrolBar) - ImageHeight(cible)) / 2 
              EndIf 
              
              ResizeGadget(#Filtre_Canvas,x,y, ImageWidth(cible), ImageHeight(cible)) 
              
              StartDrawing(CanvasOutput(#Filtre_Canvas)) 
              If IsImage(cible) : DrawImage(ImageID(cible),0,0) : EndIf 
              StopDrawing() 
              
              SetWindowTitle(#Filtre_Window,GetFilePart(file$))
            EndIf 
            
          Case #Filtre_MenuItem_6Load_Map
            
            If Not IsImage(source) 
              MessageRequester("load_image","vous devez charger une image avant",#PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
            Else 
              
              If IsImage(mappe) : FreeImage(mappe) : EndIf 
              file$ = OpenFileRequester("Image","","",0) 
              
              If file$ 
                If Not Load_Image(mappe,file$, Echelle) 
                  MessageRequester("load_image","erreur de chargement",#PB_MessageRequester_Ok | #PB_MessageRequester_Error) 
                EndIf 
                SetWindowTitle(#Filtre_Window, GetWindowTitle(#Filtre_Window) + "/" + GetFilePart(file$))
              EndIf 
            EndIf 
            
          Case #Filtre_MenuItem_2 
            
            nom$ = SaveFileRequester("Save BMP", "", "", 0) 
            If nom$ <> "" : SaveImage(cible, nom$ + ".bmp", #PB_ImagePlugin_BMP ) : EndIf 
            
            
          Case #Filtre_MenuItem_5 
            
            quit = 1 
            
            ; Case 7 
            ; opt = 0 
            ; If IsImage(1) And IsImage(2) And IsImage(3) 
            ; Update(source,mappe,cible,scale,opt) 
            ; EndIf 
            
          Case #Filtre_MenuItem_8 
            
            If GetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8) 
              SetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8,#False) 
              opt = 0 
              Echelle = 0 
            Else 
              SetMenuItemState(#Filtre_Menu,#Filtre_MenuItem_8,#True) 
              opt = 1 
              Echelle = 1 
            EndIf 
            
            If IsImage(#Filtre_Image_1) And IsImage(#Filtre_Image_2) And  IsImage(#Filtre_Image_3) 
              Update(source, mappe, cible, scale, opt) 
            EndIf 
            
        EndSelect    
    EndSelect    
  Until Event = #PB_Event_CloseWindow Or quit=1 
EndIf 
End 
M.
Répondre