Copie une portion de l'écran dans une image ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Copie une portion de l'écran dans une image ?

Message 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 .
Marcus
Messages : 187
Inscription : jeu. 22/janv./2004 19:08
Contact :

Message par Marcus »

perso je n'utilise que des sprites si je dois retravailler les graphismes
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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 :oops:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 .
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

sinon avec point et plot ça marche pas ? 8O
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

il me semble que le soldat inconnu avait trouvé une astuce super rapide pour les plots ! :D
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui ben j'allais le dire !! :lol:

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)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 .
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Moi j'y ai pensé mais je croyais que ça ne marchais pas avec un ércan : bon a savoir :D
Sinon fait une recherche il y a une une discution identique ici ou sur le musée
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ça marche avec un openscreen ? 8O

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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre