[Résolu] Fusion d'images

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
TEALC
Messages : 20
Inscription : ven. 13/févr./2004 0:43

[Résolu] Fusion d'images

Message par TEALC »

Bonjour à tous,

Je relance PB après 10/15 ans... j'essai de créer un programme pour réaliser des affiches personnalisés pour PLEX.

C'est à dire, d'ouvrir l'image originale (c'est OK) et quand je coche une case (4k et/ou HDR) sa rajoute une overlay (pas OK).

Image

Image


Pour après fusionner "les couches" et enregistrer l'image.


Merci d'avance de votre aide, j'espère avoir été assez clair.
Dernière modification par TEALC le lun. 09/mai/2022 15:41, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fusion d'images

Message par Ar-S »

Salut,

Pour fusionner une image par dessus une autre, tu dois utiliser

Code : Tout sélectionner

Startdrawing(imageOutput (#imageCible))
Drawimage ou DrawAlphaImage pour dessiner l'image 2 dans l'image 1
StopDrawing()
Puis reactualiser le gadget via setgadgetstate(#gadgetimage, imageID(#imageCible))
Voilà un code de démonstration. Un peu long car pour éviter de galérer à poster des images, j'utilise des images du web (dont la tienne)

Code : Tout sélectionner



InitNetwork()

Enumeration 
    #win
    #bt1
    #bt2
    #IM1
    #IM2
    #igadget
EndEnumeration


Declare Loadimage_net(Adr$, IDimage, NomDestination$)

UsePNGImageDecoder()

Global Li, Hi

Adr1$="https://upimg.ldvmultimedia.com/img/test.png"
Adr2$="https://www.ldvmultimedia.com/img/sospc.png"
NomDest$ = "01.png" ; si tu veux les enregistrer
NomDest2$ = "02.png" ; si tu veux les enregistrer


Procedure Loadimage_net(Adr$, IDimage, NomDestination$)
  ;Ar-S
  
  Telechargement = ReceiveHTTPMemory(Adr$, #PB_HTTP_Asynchronous)
  If Telechargement
    Repeat
      Progression = HTTPProgress(Telechargement)
      Select Progression
        Case #PB_HTTP_Success
          *Memoire = FinishHTTP(Telechargement)
          If CatchImage(IDimage,*memoire,MemorySize(*Memoire)) <> 0
   ;       SaveImage(Image,GetTemporaryDirectory() + NomDestination$) ; ou pas
          FreeMemory(*Memoire)
          
            ProcedureReturn IDimage
       Else
           IDimage = 0
           ProcedureReturn 0    
       EndIf
       
        Case #PB_HTTP_Failed,#PB_HTTP_Aborted
          Debug "Erreur au téléchargement"
           IDimage = 0
           ProcedureReturn 0    
         
        Default
          Debug "Téléchargement en cours: " + Progression + "octets reçus"
       
      EndSelect
      
      Delay(500) ; Libérer le CPU
    ForEver
  Else
    Debug "Erreur de téléchargement"
  EndIf
  ProcedureReturn IDimage
EndProcedure

;-// EXEMPLE 

; 
err = 0
If Loadimage_net(Adr1$, #IM1, NomDest$) = 0
    err+1
EndIf
If Loadimage_net(Adr2$, #IM2, NomDest2$) = 0 
    err+1 
EndIf

If err > 0
    Debug "Probleme de chargement d'image 
    End
EndIf

 HI = ImageHeight(#im1)
 LI = ImageWidth(#im1)
 
 
If OpenWindow(#WIN, 0, 0, LI, HI+31, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ButtonGadget  (#bt1, 0, hi+1, LI/2, 30, "Fermer")
    ButtonGadget  (#bt2, LI/2+5, hi+1, LI/2-10, 30, "Overlay")
    
   
   ImageGadget(#igadget,0,0,LI,HI,ImageID(#im1))
   
   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case #BT1 
              CloseWindow(0)
              End  
              
          Case #BT2 ; Overlay
              
              StartDrawing(ImageOutput(#im1))
              DrawAlphaImage(ImageID(#im2),0,5,255) ; On dessin l'image 2 sur l'image 1 (tu peux tout aussi créer une image 3 vierge si tu veux garder l'image 1 intacte... 
              StopDrawing()
              SetGadgetState(#igadget,ImageID(#im1)) ; On affiche l'image 1 modifiée
              
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf


FreeImage(#im1) ; => à mettre en fin de code
FreeImage(#im2) 
  
  
  
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
TEALC
Messages : 20
Inscription : ven. 13/févr./2004 0:43

Re: Fusion d'images

Message par TEALC »

Merci de m'avoir répondu, je teste au plus vite.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Fusion d'images

Message par Mesa »

Attention, il y a une limite à la taille de l'image qui est de : 8192x8192 .
Voir l'aide de createimage().

M.
TEALC
Messages : 20
Inscription : ven. 13/févr./2004 0:43

Re: Fusion d'images

Message par TEALC »

Super, j'ai réussi à faire exactement se que je voulais grâce à toi.

Je redimensionne en 408x600 donc aucun problème de taille, merci pour la précision.


Je vais pourvoir attaquer le module pour récupérer directement les image d'internet, ton bout de code va aussi m'aider.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Résolu] Fusion d'images

Message par Ar-S »

Content.
J'utilise Plex aussi, il est excellent. Serveur sur Pi4 :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
TEALC
Messages : 20
Inscription : ven. 13/févr./2004 0:43

Re: [Résolu] Fusion d'images

Message par TEALC »

Voici la version fonctionnelle si tu veux tester.

Lien Uptobox
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Résolu] Fusion d'images

Message par Ar-S »

ça fonctionne bien.
Tu pourrais pousser le vice à remplacer ton imagegadget par un canvas puis à déplacer l'image ajouté à l'endroit désiré sur la jaquette ^^
ça demande un peu de taf mais pas tant :)

Voilà un superbe code de Danilo (de 2013 !)

Code : Tout sélectionner

;https://www.purebasic.fr/english/viewtopic.php?f=13&t=54098&start=6
;auteur Danilo  mars 2013

Structure canvasitem
  img.i : x.i : y.i : width.i : height.i
EndStructure

Global isCurrentItem = #False
Global currentItemXOffset.i, currentItemYOffset.i

Global NewList Images.canvasitem()

Procedure AddImage(x,y,img)
  If AddElement(Images())
    Images()\img    = img
    Images()\x      = x
    Images()\y      = y
    Images()\width  = ImageWidth(img)
    Images()\height = ImageHeight(img)
  EndIf
EndProcedure

Procedure DrawCanvas()
  If StartDrawing(CanvasOutput(0))
    Box(0,0,GadgetWidth(0),GadgetHeight(0),RGB(255,255,255))
    ForEach Images()
      DrawImage(ImageID(Images()\img),Images()\x,Images()\y) ; draw all images with z-order
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure HitTest(x,y)
  If LastElement(Images()) ; search for hit, starting from end (z-order)
    Repeat
      If x >= Images()\x And x <  Images()\x + Images()\width
        If y >= Images()\y And y < Images()\y + Images()\height
          match = #True
          Break
        EndIf
      EndIf
    Until PreviousElement(Images())=0
  EndIf
  If match
    isCurrentItem = #True
    currentItemXOffset = x - Images()\x
    currentItemYOffset = y - Images()\y
    temp.canvasitem = Images()
    DeleteElement(Images())
    LastElement(Images()) ; move match to last position (z-order)
    AddElement(Images())
    Images() = temp
  Else
    isCurrentItem = #False
  EndIf
  ProcedureReturn isCurrentItem
EndProcedure

AddImage(10,10,LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/PureBasic.bmp"))
AddImage(100,100,LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/GeeBee2.bmp"))
AddImage(50,200,LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/AlphaChannel.bmp"))

If OpenWindow(0, 0, 0, 420, 420, "Move/Drag Canvas Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 400, 400)
 
  DrawCanvas()
 
  Repeat
    Event = WaitWindowEvent()
   
    If Event = #PB_Event_Gadget And EventGadget() = 0
      Select EventType()
        Case #PB_EventType_LeftButtonDown
          x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
          y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
          If HitTest(x,y)
            DrawCanvas()
          EndIf
          Drag = #True
        Case #PB_EventType_LeftButtonUp
          Drag = #False
        Case #PB_EventType_MouseMove
          If Drag = #True
            If isCurrentItem
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              If LastElement(Images())
                Images()\x = x - currentItemXOffset
                Images()\y = y - currentItemYOffset
                DrawCanvas()
              EndIf
            EndIf
          EndIf
      EndSelect
    EndIf   
   
  Until Event = #PB_Event_CloseWindow
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre