Page 1 sur 1
[Résolu] Fusion d'images
Publié : lun. 09/mai/2022 7:28
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).
Pour après fusionner "les couches" et enregistrer l'image.
Merci d'avance de votre aide, j'espère avoir été assez clair.
Re: Fusion d'images
Publié : lun. 09/mai/2022 12:11
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)
Re: Fusion d'images
Publié : lun. 09/mai/2022 12:19
par TEALC
Merci de m'avoir répondu, je teste au plus vite.
Re: Fusion d'images
Publié : lun. 09/mai/2022 13:41
par Mesa
Attention, il y a une limite à la taille de l'image qui est de : 8192x8192 .
Voir l'aide de createimage().
M.
Re: Fusion d'images
Publié : lun. 09/mai/2022 15:41
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.
Re: [Résolu] Fusion d'images
Publié : lun. 09/mai/2022 17:24
par Ar-S
Content.
J'utilise Plex aussi, il est excellent. Serveur sur Pi4

Re: [Résolu] Fusion d'images
Publié : lun. 09/mai/2022 17:42
par TEALC
Voici la version fonctionnelle si tu veux tester.
Lien Uptobox
Re: [Résolu] Fusion d'images
Publié : lun. 09/mai/2022 20:31
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