DesktopPixmap

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Suco-X

Betreff: DesktopPixmap

BeitragMi, Jan 04, 2006 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich habe eine Funktion geschrieben, mit der man den Desktop abknippsen kann und eine Pixmap von diesem erhält.
Win32 Only.
Bitte testet doch mal und gebt mir das Ergebnis(PixmapsPerSecond).

Code: [AUSKLAPPEN]

Rem
DesktopPixmap function by Suco-X
End Rem

Strict


Function GetDesktopPixmap:TPixmap()
   
   Extern "Win32"
      Function GetDIBits(hdc:Int, bitmap:Int, Start:Int, Num:Int, bits:Byte Ptr, lpbi:Byte Ptr, usage:Int)
      Function CreateCompatibleBitmap(hdc:Int, Width:Int, Height:Int)
      Function CreateDIBSection(hdc:Int, pbmi:Byte Ptr, usage:Int, Bits:Byte Ptr, hSection:Int, Offset:Int)
      Function SelectObject(hdc:Int, obj:Int)
      Function CreateCompatibleDC(hdc:Int)
      Function GetDesktopWindow()
      Function GetWindowDC(hwnd:Int)
      Function GetDeviceCaps(hdc:Int, index:Int)
      Function DeleteDC(hdc:Int)
      Function DeleteObject(obj:Int)
      Function ReleaseDC(hwdn:Int, hdc:Int)
      Function BitBlt(hdc,x,y,w,h,src_dc,src_x,src_y,dwrop)
   End Extern


   ?Win32
   
      Type BITMAPINFO
         Field biSize:Int
         Field biWidth:Int
         Field biHeight:Int
         Field biPlanes:Short
         Field biBitCount:Short
         Field biCompression:Int
         Field biSizeImage:Int
         Field biXPelsPerMeter:Int
         Field biYPelsPerMeter:Int
         Field biClrUsed:Int
         Field biClrImportant:Int
         
         Field R:Byte
         Field G:Byte
         Field B:Byte
         Field Res:Byte
      End Type
      
      
      Const HORZRES:Int = 8
      Const VERTRES:Int = 10
   
      Local HwndDesktop:Int
      Local hdcDesktop:Int
      Local hdcMem:Int
      Local DesktopWidth:Int
      Local DesktopHeight:Int
      Local bmpMem:Int
      Local INFO:BITMAPINFO
      Local FinalPixmap:TPixmap
   
      HwndDesktop = GetDesktopWindow()
   
      If Not HwndDesktop
         Return Null
      EndIf
      
      
      hdcDesktop = GetWindowDC(HwndDesktop)
      
      If Not HdcDesktop
         Return Null
      EndIf
      
      
      hdcMem = CreateCompatibleDC(hdcDesktop)
      
      If Not HdcMem
         Return Null
      EndIf
      
      
      DesktopWidth = GetDeviceCaps(hdcDesktop, HORZRES)
      DesktopHeight = GetDeviceCaps(hdcDesktop, VERTRES)
   
      If DesktopWidth = 0 Or DesktopHeight = 0
         Return Null
      EndIf
      
      
      bmpMem  = CreateCompatibleBitmap(hdcDesktop, DesktopWidth, DesktopHeight)
   
      If Not BmpMem
         Return Null
      EndIf
      
      
      If Not SelectObject(HdcMem, bmpMem)
         Return Null
      EndIf
      
      Info                = New BITMAPINFO
      Info.bisize         = SizeOf(INFO)
      info.BiWidth        = DesktopWidth
      Info.biHeight       = DesktopHeight
      Info.biPlanes       = 1
      info.biBitCount     = 32
      Info.biCompression  = 0
      
      
      If Not BitBlt(hdcMem,0,0,Info.biWidth,Info.biHeight, hdcDesktop,0,0,ROP_SRCCOPY)   
         Return Null
      EndIf
      
      FinalPixmap = CreatePixmap(info.biWidth, info.biHeight, PF_BGRA8888)
      
      If Not GetDIBits(hdcMem, bmpMem, 0, Info.biHeight, FinalPixmap.PixelPtr(0,0), info, 0)
         Return Null
      EndIf
      
      FinalPixmap = YFlipPixmap(FinalPixmap)
      
      DeleteDC(HdcMem)
      DeleteObject(bmpMem)
      ReleaseDC(hwndDesktop, hdcDesktop)
      
      Return FinalPixmap
      
   ?
   
   ?Linux
      Return Null
   ?
   
   ?MacOs
      Return Null
   ?
End Function



Local Time:Int = MilliSecs()

Local DesktopScreen:TPixmap = GetDesktopPixmap()

Time = MilliSecs()-Time

Print ""
Print "PixmapsPerSecond: "+(1000/Time)
Print ""

If DesktopScreen = Null
   Print "TEST FEHLGESCHLAGEN"
EndIf



Graphics 1024, 768,0

DrawPixmap DesktopScreen,0,0
Flip
WaitKey()


Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

bruZard

BeitragMi, Jan 04, 2006 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Stolze 2 Smile
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Artemis

BeitragMi, Jan 04, 2006 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
cool
hab 15 stück bei 1280x1024

YellowRider

Ehemaliger Admin

BeitragMi, Jan 04, 2006 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
19 pps bei 1280x1024.

Kann man gut gebrauchen Smile

edit:

1024x768: 32pps
1152x864: 25pps
1280x1024: 19pps
1600x1200: 13pps
  • Zuletzt bearbeitet von YellowRider am Mi, Jan 04, 2006 19:24, insgesamt einmal bearbeitet
 

gamble

BeitragMi, Jan 04, 2006 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
21pps bei 1152x864

bruZard

BeitragMi, Jan 04, 2006 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf meinem "Zuhause-Rechner" (siehe Signatur) komme ich bei ebenfalls 1280x1024 auf 12 Smile
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

d-bug

BeitragMi, Jan 04, 2006 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
19pps bei 1280x800
19pps bei 1024x768

Markus2

BeitragDo, Jan 05, 2006 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool,
aber ich wundere mich gerade über YFlipPixmap(FinalPixmap) Confused

Suco-X

BeitragDo, Jan 05, 2006 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

aber ich wundere mich gerade über YFlipPixmap(FinalPixmap)


Und ich wunderte mich, dass die Pixmap ohne YFlipPixmap auf dem Kopf stand Laughing
Ist wohl so ne Windows Sache, wie bei den Bitmaps. Die Pixeldaten einfach normal zu speichern, wäre wohl zu verständlich.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Fetze

BeitragFr, Jan 06, 2006 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
45 bei 1024 * 768

Plasma(alt)

Betreff: lol

BeitragFr, Jan 06, 2006 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
klugscheiß an
bmp sind verkehrt rum gespeichert .
klugscheiß aus
DIV is dead !

klin

Betreff: sry..

BeitragDi, März 30, 2010 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
tut mir leid dass ich nun son alten Thread rauspacke, aber ich möchte ungern einen neuen Thread erstellen wenn dieser hier existiert.
Also.. meine frage ist: Wie kann ich nur einen bestimmten bereich von einem Desktop snapshoten? Ich benötige das wegen der Geschwindigkeit.
z.B. ich will nur im Desktop bereich von 200,200 und 640,480 snapshoten. Ich habe mir mal den befehl BitBlt unter die Lupe genommen. Jedoch verrutscht er nur die Pixmap um einige pixeln.

Hat jemand noch eine andere Idee? Es geht mir ja nur, dass das Programm von einer bestimmten X,Y Position anfängt einen screen zu machen.

THX
MFG
Klin

DaysShadow

BeitragDi, März 30, 2010 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde spontan das Modul hier nehmen: http://www.chaos-interactive.d...extension/, den Befehl DesktopPixmap benutzen und mir dann den gewollten Bereich in eine andere Pixmap kopieren.

MfG DaysShadow
Blessed is the mind too small for doubt
 

ruby

BeitragMi, Aug 25, 2010 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei der Funktion desktopPixmap aus dem desktopext-Modul handelt es sich um die gleiche Funktion hier aus diesem Thread Smile

FireballFlame

BeitragMi, Aug 25, 2010 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich komm auf ca. 17. 1280x960 Pixel.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Suco-X

Betreff: ....

BeitragDo, Aug 26, 2010 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich habe keine Ahnung wieso ich damals 32 Bit genommen habe, aber mit 24 Bit läuft das ganze nochmal etwas schneller:

Code: [AUSKLAPPEN]


Rem
DesktopPixmap function by Suco-X
End Rem

Strict


Function GetDesktopPixmap:TPixmap()
   
   Extern "Win32"
      Function GetDIBits(hdc:Int, bitmap:Int, Start:Int, Num:Int, bits:Byte Ptr, lpbi:Byte Ptr, usage:Int)
      Function CreateCompatibleBitmap(hdc:Int, Width:Int, Height:Int)
      Function CreateDIBSection(hdc:Int, pbmi:Byte Ptr, usage:Int, Bits:Byte Ptr, hSection:Int, Offset:Int)
      Function SelectObject(hdc:Int, obj:Int)
      Function CreateCompatibleDC(hdc:Int)
      Function GetDesktopWindow()
      Function GetWindowDC(hwnd:Int)
      Function GetDeviceCaps(hdc:Int, index:Int)
      Function DeleteDC(hdc:Int)
      Function DeleteObject(obj:Int)
      Function ReleaseDC(hwdn:Int, hdc:Int)
      Function BitBlt(hdc,x,y,w,h,src_dc,src_x,src_y,dwrop)
   End Extern


   ?Win32
   
      Type BITMAPINFO
         Field biSize:Int
         Field biWidth:Int
         Field biHeight:Int
         Field biPlanes:Short
         Field biBitCount:Short
         Field biCompression:Int
         Field biSizeImage:Int
         Field biXPelsPerMeter:Int
         Field biYPelsPerMeter:Int
         Field biClrUsed:Int
         Field biClrImportant:Int
         
         Field R:Byte
         Field G:Byte
         Field B:Byte
         Field Res:Byte
      End Type
     
     
      Const HORZRES:Int = 8
      Const VERTRES:Int = 10
   
      Local HwndDesktop:Int
      Local hdcDesktop:Int
      Local hdcMem:Int
      Local DesktopWidth:Int
      Local DesktopHeight:Int
      Local bmpMem:Int
      Local INFO:BITMAPINFO
      Local FinalPixmap:TPixmap
   
      HwndDesktop = GetDesktopWindow()
   
      If Not HwndDesktop
         Return Null
      EndIf
     
     
      hdcDesktop = GetWindowDC(HwndDesktop)
     
      If Not HdcDesktop
         Return Null
      EndIf
     
     
      hdcMem = CreateCompatibleDC(hdcDesktop)
     
      If Not HdcMem
         Return Null
      EndIf
     
     
      DesktopWidth = GetDeviceCaps(hdcDesktop, HORZRES)
      DesktopHeight = GetDeviceCaps(hdcDesktop, VERTRES)
   
      If DesktopWidth = 0 Or DesktopHeight = 0
         Return Null
      EndIf
     
     
      bmpMem  = CreateCompatibleBitmap(hdcDesktop, DesktopWidth, DesktopHeight)
   
      If Not BmpMem
         Return Null
      EndIf
     
     
      If Not SelectObject(HdcMem, bmpMem)
         Return Null
      EndIf
     
      Info                = New BITMAPINFO
      Info.bisize         = SizeOf(INFO)
      info.BiWidth        = DesktopWidth
      Info.biHeight       = DesktopHeight
      Info.biPlanes       = 1
      info.biBitCount     = 24
      Info.biCompression  = 0
     
     
      If Not BitBlt(hdcMem,0,0,Info.biWidth,Info.biHeight, hdcDesktop,0,0,ROP_SRCCOPY)   
         Return Null
      EndIf
     
      FinalPixmap = CreatePixmap(info.biWidth, info.biHeight, PF_BGR888)
     
      If Not GetDIBits(hdcMem, bmpMem, 0, Info.biHeight, FinalPixmap.PixelPtr(0,0), info, 0)
         Return Null
      EndIf
     
      FinalPixmap = YFlipPixmap(FinalPixmap)
     
      DeleteDC(HdcMem)
      DeleteObject(bmpMem)
      ReleaseDC(hwndDesktop, hdcDesktop)
     
      Return FinalPixmap
     
   ?
   
   ?Linux
      Return Null
   ?
   
   ?MacOs
      Return Null
   ?
End Function



Local Time:Int = MilliSecs()

Local DesktopScreen:TPixmap = GetDesktopPixmap()

Time = MilliSecs()-Time

Print ""
Print "PixmapsPerSecond: "+(1000/Time)
Print ""

If DesktopScreen = Null
   Print "TEST FEHLGESCHLAGEN"
EndIf


SetGraphicsDriver(GLMax2DDriver())

Graphics 1024, 768,0

DrawPixmap DesktopScreen,0,0
Flip
WaitKey()


Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group