La même chose avec possibilité de choisir une image jpeg, bmp,..
    ProcedureDLL.s    GetUserProfileDirectory()  ; Retourne l'adresse du répertoire utilisateur  
       OpenProcessToken_   (   GetCurrentProcess_   (), $08, @token)
    
    Length.l = 512
    directory$ =    Space   (Length)
    
       GetUserProfileDirectory_   (token, directory$, @Length)
       ProcedureReturn       Left   (directory$, Length) +   "\"   
   EndProcedure   
   ProcedureDLL.s    GetWindowsDirectory_BIS()  ; Retourne l'adresse de Windows  
    windir$ =    Space   (255) :    GetWindowsDirectory_   ( @windir$, 255) :    If       Right   (windir$, 1) <>   "\"    : windir$ +   "\"    :    EndIf   
       ProcedureReturn    windir$
   EndProcedure   
   ProcedureDLL    SetWallpaper(FileName.s, Image, mode.l, BackgroundColor.l)  ; mode=1 Etirer, 2 Centrer, 3 Centrer et agrandir, 4 Mosaïque, 5 Mosaïque et agrandi (si FileName="" , Image sera pris en compte et inversement)  
     ; mode=1 Etirer  
     ; mode=2 Centrer  
     ; mode=3 Centrer et agrandissement proportionnel  
     ; mode=4 Mosaïque  
     ; mode=5 Mosaïque et agrandissement proportionel  
       If    FileName
           UseJPEGImageDecoder   ()
 ;        UseEC_OLEImageDecoder()  
           UsePNGImageDecoder   ()
           UseTGAImageDecoder   ()
           UseTIFFImageDecoder   ()
        idi =    LoadImage   (  #PB_Any  , FileName)
       ElseIf    Image
        idi = Image
       EndIf   
    
       If       IsImage   (idi)
        id =    ImageID   (idi)
        largimag =    ImageWidth   (idi)
        hautimag =    ImageHeight   (idi)
        dx =    GetSystemMetrics_   (  #SM_CXSCREEN  )
        dy =    GetSystemMetrics_   (  #SM_CYSCREEN  )
        lon =    Len   (   GetExtensionPart   (FileName))
           If    IsAdmin() = 1
               If       OSVersion   () =   #PB_OS_Windows_XP      Or       OSVersion   () =   #PB_OS_Windows_2000  
                photo.s = GetWindowsDirectory_BIS() +   "Web\Wallpaper\Fond d'écran.bmp"   
               Else   
                photo.s = GetWindowsDirectory_BIS() +   "Fond d'écran.bmp"   
               EndIf   
           Else   
            photo.s = GetUserProfileDirectory() +   "Fond d'écran.bmp"   
           EndIf   
           If    mode = 1
               ResizeImage   (idi, dx, dy)
               SaveImage   (idi, photo)
           ElseIf    mode = 2
            idi2 =    CreateImage   (  #PB_Any  , dx, dy)
               StartDrawing   (   ImageOutput   (idi2))
                   Box   (0, 0, dx, dy, BackgroundColor)
                   DrawImage   (Id, (dx - largimag) / 2, (dy - hautimag) / 2)
               StopDrawing   ()
               SaveImage   (idi2, photo)
           ElseIf    mode = 3
            idi2 =    CreateImage   (  #PB_Any  , dx, dy)
               StartDrawing   (   ImageOutput   (idi2))
                   Box   (0, 0, dx, dy, BackgroundColor)
                clarg.f = dx / largimag
                chaut.f = dy / hautimag
                   If    clarg > chaut
                       DrawImage   (Id, (dx -    Round   (chaut * largimag, 0)) / 2, 0,    Round   (chaut * largimag, 0), dy)
                   ElseIf    clarg < chaut
                       DrawImage   (Id, 0, (dy -    Round   (clarg * hautimag, 0)) / 2, dx,    Round   (clarg * hautimag, 0))
                   Else   
                       DrawImage   (id, 0, 0, dx, dy)
                   EndIf   
               StopDrawing   ()
               SaveImage   (idi2, photo)
               FreeImage   (idi2)
           ElseIf    mode = 4
            idi2 =    CreateImage   (  #PB_Any  , dx, dy)
               StartDrawing   (   ImageOutput   (idi2))
                   Box   (0, 0, dx, dy, BackgroundColor)
                nc =    Round   (dx / largimag, 1)
                nl =    Round   (dy / hautimag, 1)
                   For    a = 0    To    nc - 1
                       For    b = 0    To    nl - 1
                           DrawImage   (id, a * largimag, b * hautimag)
                       Next   
                   Next   
               StopDrawing   ()
               SaveImage   (idi2, photo)
               FreeImage   (idi2)
           ElseIf    mode = 5
            idi2 =    CreateImage   (  #PB_Any  , dx, dy)
               StartDrawing   (   ImageOutput   (idi2))
                   Box   (0, 0, dx, dy, BackgroundColor)
                clarg.f = dx / largimag
                chaut.f = dy / hautimag
                   If    clarg > chaut
                    width =    Round   (chaut * largimag, 0)
                    height = dy
                   ElseIf    clarg < chaut
                    width = dx
                    height =    Round   (clarg * hautimag, 0)
                   Else   
                    width = dx
                    height = dy
                   EndIf   
                nc =    Round   (dx / width, 1)
                nl =    Round   (dy / height, 1)
                   For    a = 0    To    nc - 1
                       For    b = 0    To    nl - 1
                           DrawImage   (id, a * width, b * Height, width, height)
                       Next   
                   Next   
               StopDrawing   ()
               SaveImage   (idi2, photo)
               FreeImage   (idi2)
           EndIf   
           If    FileName
               FreeImage   (idi)
           EndIf   
           ProcedureReturn       SystemParametersInfo_   (  #SPI_SETDESKWALLPAPER  , 0, photo,   #SPIF_UPDATEINIFILE   |   #SPIF_SENDWININICHANGE  )
       EndIf   
   EndProcedure