Page 1 sur 1
Copie une portion de l'écran dans une image ?
Publié : sam. 18/déc./2004 8:40
par comtois
Pour copier une portion de l'écran , j'ai vu cette commande
GrabSprite(#Sprite, x, y, Largeur, Hauteur)
Mais je voudrais le faire avec une image , comment copier un sprite dans une image ? ou comment prendre la portion d'écran directement dans l'image ?
Si seulement GrabImage() pouvait fonctionner comme GrabSprite() , ça m'aurait arrangé
on peut faire un DisplaySprite dans un sprite , mais pas dans une image, dommage , ça m'aurait arrangé , bref , là je ne vois pas comment faire .
Publié : sam. 18/déc./2004 9:23
par Marcus
perso je n'utilise que des sprites si je dois retravailler les graphismes
Publié : sam. 18/déc./2004 9:30
par comtois
ben en fait l'objectif final c'est de copier l'image dans une texture.
et je peux faire un DrawImage() dans une texture , mais pas un DisplaySprite() , d'où mon problème , comment je récupère une image ?
à moins que quelqu'un sache comment copier une portion d'écran directement dans une texture ? et mon problème serait résolu

Publié : sam. 18/déc./2004 9:36
par Oliv
Moi je fait un grabSprite(),je le sauvegarde et le recharge en image, ça marche mais bon, c'est pas très joli tout ça

Publié : sam. 18/déc./2004 9:46
par comtois
ben si ça dépanne faut pas s'en priver

c'est ce que je fais quand je n'ai besoin que d'une image, mais là je voudrais prendre une image à des intervalles de temps réguliers , les accès au disque dur ne sont pas très conseillés pour ce que je veux faire .
Publié : sam. 18/déc./2004 10:13
par Backup
sinon avec point et plot ça marche pas ?

Publié : sam. 18/déc./2004 10:31
par comtois
ben , ça risque d'être très très lent
mais j'envisage tout de même de faire un essai en utilisant cette méthode , pour voir si j'obtiens l'effet escompté , même à 3 images/seconde , ça me permettra de valider le principe , il restera ensuite à améliorer la copie

Publié : sam. 18/déc./2004 10:52
par Backup
il me semble que le soldat inconnu avait trouvé une astuce super rapide pour les plots !

Publié : sam. 18/déc./2004 10:56
par gnozal
J'ai ce (très) vieux morceau de code qui est peut-être utile :
Code : Tout sélectionner
;
; Faire une copie d'écran et la sauver sous forme de fichier JPEG
;
;-Constantes
; Window Constants
Enumeration
#Win_CopieEcran
EndEnumeration
; Gadget Constants
Enumeration
#Btn_CopieEcran
#Btn_Quitter
EndEnumeration
;-Procédures
; Faire la copie d'écran et la sauver en JPEG
Procedure SaveDesktopScreenshotToJPEG(FileName.s)
; Créer un image de la taille de l'écran
ImageNr.l = 666
Width.l = GetSystemMetrics_(#SM_CXSCREEN)
Height.l = GetSystemMetrics_(#SM_CYSCREEN)
hImage.l = CreateImage(ImageNr,Width,Height)
; Copier l'écran dans l'image
hdc.l = StartDrawing(ImageOutput())
BitBlt_(hdc,0,0,Width,Height,GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY)
StopDrawing()
; Sauver l'image au format JPEG
UseJPEGImageEncoder()
Quality.l = 7
SaveImage(ImageNr,FileName,#PB_ImagePlugin_JPEG,Quality)
; Libérer les ressources
FreeImage(ImageNr)
EndProcedure
; Afficher l'application
Procedure Open_Win_CopieEcran()
If OpenWindow(#Win_CopieEcran, 0, 0, 150, 24, #PB_Window_BorderLess, "Copie d'écran")
If CreateGadgetList(WindowID())
ButtonGadget(#Btn_CopieEcran, 0, 0, 75, 25, "Copie d'écran")
GadgetToolTip(#Btn_CopieEcran, "Faire une copie d'écran")
ButtonGadget(#Btn_Quitter, 75, 0, 75, 25, "Quitter")
GadgetToolTip(#Btn_Quitter, "Quitter la copie d'écran")
EndIf
EndIf
EndProcedure
; Forcer le premier-plan
Procedure ForceForeground(handle.l)
thread1=GetWindowThreadProcessID_(GetForegroundWindow_(),0)
thread2=GetWindowThreadProcessID_(handle,0)
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
SetForegroundWindow_(handle)
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf
EndProcedure
;- Main
Open_Win_CopieEcran()
Repeat
ForceForeground(WindowID())
Event = WaitWindowEvent()
If Event = #PB_EventGadget
GadgetID = EventGadgetID()
If GadgetID = #Btn_CopieEcran
; Cacher la fenêtre
HideWindow(#Win_CopieEcran, 1)
RedrawWindow_(0,0,0,0)
Sleep_(100)
; Faire la copie d'écran
SaveDesktopScreenshotToJPEG("CopieEcran.jpg")
; Montrer la fenêtre
HideWindow(#Win_CopieEcran, 0)
ElseIf GadgetID = #Btn_Quitter
; Quitter
Break
EndIf
EndIf
Until Event = #PB_EventCloseWindow
End
Cet exemple recopie tout l'écran dans un JPEG.
Publié : sam. 18/déc./2004 10:58
par Backup
oui ben j'allais le dire !!
le soldat inconu avait fait ça :
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Faire une copie d'écran
#CAPTUREBLT = $40000000
Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
If OpenLibrary(0, "user32.dll")
CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
CloseLibrary(0)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Plein écran")
SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
SetWinTransparency (WindowID(), 180)
; Pour changer le niveau de transparence de la fenêtre
; Le niveau de transparence doit être compris entre 1 (transparence totale) et 255 (opaque)
Repeat
Event = WaitWindowEvent()
Until Event = #WM_CLOSE
EndIf
Ecran_Largeur = GetSystemMetrics_(#SM_CXSCREEN)
Ecran_Hauteur = GetSystemMetrics_(#SM_CYSCREEN)
DC = GetDC_(0)
CreateImage(0, Ecran_Largeur, Ecran_Hauteur)
Dessin = StartDrawing(ImageOutput())
BitBlt_(Dessin, 0, 0, Ecran_Largeur, Ecran_Hauteur, DC, 0, 0, #SRCPAINT|#CAPTUREBLT)
; pour n'avoir que le fond sans les fenetre retirer le #CAPTUREBLT
StopDrawing()
ReleaseDC_(0, DC)
SaveImage(0, "Copie d'écran.bmp")
Delay(2000)
Publié : sam. 18/déc./2004 18:29
par comtois
merci à vous deux , je n'y pensais plus à ce type de solution .
Je vais voir ce que je peux en faire.En fait , je ne sais pas si ça ira , parce que j'aurais besoin de copier l'écran , mais sans l'afficher ! en gros faire une copie depuis le buffer de l'écran , il me semble avoir lu un post à ce sujet ? je vais faire une recherche , mais en attendant , je peux essayer avec vos codes , merci .
Publié : sam. 18/déc./2004 18:32
par Oliv
Moi j'y ai pensé mais je croyais que ça ne marchais pas avec un ércan : bon a savoir
Sinon fait une recherche il y a une une discution identique ici ou sur le musée
Publié : sam. 18/déc./2004 23:57
par Le Soldat Inconnu
ça marche avec un openscreen ?
j'ai jamais réussi en tout cas, je voulais pasez par la pour faire un printscreen dans un de mes jeu mais niet, ça ne marchait pas.
Donc si quelqu'un arrive à se servir de bitBlt dans un openscreen, ça m'intéresse