Page 1 sur 1

Capture d'écran

Publié : mar. 18/oct./2005 21:02
par Droopy
Compilation de fonctions pour capturer des zones d'écran

Code : Tout sélectionner

;/ Author : Kale / Droopy

; Return pointer to BMP SnapShot

Global CaptureScreenWidth , CaptureScreenHeight , CaptureScreenBMPHandle

Procedure CaptureScreenPart(Left.l, Top.l, Width.l, Height.l) 
  dm.DEVMODE 
  BMPHandle.l 
  srcDC = CreateDC_("DISPLAY", "", "", dm) 
  trgDC = CreateCompatibleDC_(srcDC) 
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height) 
  SelectObject_( trgDC, BMPHandle) 
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, Left, Top, #SRCCOPY) 
  DeleteDC_( trgDC) 
  ReleaseDC_( BMPHandle, srcDC)
  
  CaptureScreenHeight=Height
  CaptureScreenWidth=Width
  CaptureScreenBMPHandle=BMPHandle
  ProcedureReturn BMPHandle 
EndProcedure 

Procedure CaptureFullScreen()
  ProcedureReturn CaptureScreenPart(0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))
EndProcedure

Procedure CaptureWindow(Handle.l) ; ### The Window must be visible !

    If Handle 
      WindowSize.RECT 
      GetWindowRect_(Handle, @WindowSize) 
      ProcedureReturn CaptureScreenPart(WindowSize\Left, WindowSize\Top, WindowSize\Right - WindowSize\Left, WindowSize\Bottom - WindowSize\Top) 
    EndIf
    
EndProcedure 

; #PB_ImagePlugin_BMP / #PB_ImagePlugin_JPEG / #PB_ImagePlugin_PNG
; JpegCompression 0 (Bad) to 10 (Best) --> Only for Jpeg

Procedure SaveCapture(File.s, ImagePlugin , JpegCompression) 
  
  If CaptureScreenBMPHandle
    Id=CreateImage(#PB_Any, CaptureScreenWidth, CaptureScreenHeight) 
    StartDrawing(ImageOutput()) 
    DrawImage(CaptureScreenBMPHandle,0,0) 
    StopDrawing()
    
    Select ImagePlugin
      
      Case #PB_ImagePlugin_JPEG 
        UseJPEGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_JPEG,JpegCompression)
        
      Case #PB_ImagePlugin_PNG
        UsePNGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_PNG)
        
      Default
        Retour=SaveImage(Id, File)
        
    EndSelect

    FreeImage(Id)
    
  EndIf
  
  ProcedureReturn Retour
EndProcedure

;/ Test
CaptureWindow(GetHandle("jaPBe"))
SaveCapture("c:\CaptureFullScreen.png",#PB_ImagePlugin_PNG,0)
SaveCapture("c:\CaptureFullScreen.bmp",#PB_ImagePlugin_BMP,0)
SaveCapture("c:\CaptureFullScreen.Jpg",#PB_ImagePlugin_JPEG,10)

Publié : mar. 18/oct./2005 21:34
par Chris
Pas mal, mais

Code : Tout sélectionner

CaptureWindow(GetHandle("jaPBe"))
doit faire partie d'une lib utilisateur, ça ne fonctionne pas chez moi.

A la place, il suffit de mettre

Code : Tout sélectionner

CaptureWindow(FindWindow_(#Null, "jaPBe"))
pour que ça marche

Publié : mar. 18/oct./2005 22:29
par Droopy
Merci, exemple corrigé

Re: Capture d'écran

Publié : ven. 01/nov./2013 2:15
par Ar-S
Droopy a écrit :Compilation de fonctions pour capturer des zones d'écran

Code : Tout sélectionner

;/ Author : Kale / Droopy

; Return pointer to BMP SnapShot

Global CaptureScreenWidth , CaptureScreenHeight , CaptureScreenBMPHandle

Procedure CaptureScreenPart(Left.l, Top.l, Width.l, Height.l) 
  dm.DEVMODE 
  BMPHandle.l 
  srcDC = CreateDC_("DISPLAY", "", "", dm) 
  trgDC = CreateCompatibleDC_(srcDC) 
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height) 
  SelectObject_( trgDC, BMPHandle) 
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, Left, Top, #SRCCOPY) 
  DeleteDC_( trgDC) 
  ReleaseDC_( BMPHandle, srcDC)
  
  CaptureScreenHeight=Height
  CaptureScreenWidth=Width
  CaptureScreenBMPHandle=BMPHandle
  ProcedureReturn BMPHandle 
EndProcedure 

Procedure CaptureFullScreen()
  ProcedureReturn CaptureScreenPart(0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))
EndProcedure

Procedure CaptureWindow(Handle.l) ; ### The Window must be visible !

    If Handle 
      WindowSize.RECT 
      GetWindowRect_(Handle, @WindowSize) 
      ProcedureReturn CaptureScreenPart(WindowSize\Left, WindowSize\Top, WindowSize\Right - WindowSize\Left, WindowSize\Bottom - WindowSize\Top) 
    EndIf
    
EndProcedure 

; #PB_ImagePlugin_BMP / #PB_ImagePlugin_JPEG / #PB_ImagePlugin_PNG
; JpegCompression 0 (Bad) to 10 (Best) --> Only for Jpeg

Procedure SaveCapture(File.s, ImagePlugin , JpegCompression) 
  
  If CaptureScreenBMPHandle
    Id=CreateImage(#PB_Any, CaptureScreenWidth, CaptureScreenHeight) 
    StartDrawing(ImageOutput()) 
    DrawImage(CaptureScreenBMPHandle,0,0) 
    StopDrawing()
    
    Select ImagePlugin
      
      Case #PB_ImagePlugin_JPEG 
        UseJPEGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_JPEG,JpegCompression)
        
      Case #PB_ImagePlugin_PNG
        UsePNGImageEncoder()
        Retour=SaveImage(Id, File,#PB_ImagePlugin_PNG)
        
      Default
        Retour=SaveImage(Id, File)
        
    EndSelect

    FreeImage(Id)
    
  EndIf
  
  ProcedureReturn Retour
EndProcedure

;/ Test
CaptureWindow(GetHandle("jaPBe"))
SaveCapture("c:\CaptureFullScreen.png",#PB_ImagePlugin_PNG,0)
SaveCapture("c:\CaptureFullScreen.bmp",#PB_ImagePlugin_BMP,0)
SaveCapture("c:\CaptureFullScreen.Jpg",#PB_ImagePlugin_JPEG,10)
Ligne 45 faudrait pas mettre StartDrawing(ImageOutput(Id)) (manque le id dans la procedure SaveCapture() ) ?

Re: Capture d'écran

Publié : sam. 02/nov./2013 1:23
par graph100
le post date de 2005, il faut simplement prendre le code et le mettre à jour :roll: