DesktopPixmap
Übersicht

![]() |
Suco-XBetreff: DesktopPixmap |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stolze 2 ![]() |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
cool
hab 15 stück bei 1280x1024 |
||
![]() |
YellowRiderEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
19 pps bei 1280x1024.
Kann man gut gebrauchen ![]() edit: 1024x768: 32pps 1152x864: 25pps 1280x1024: 19pps 1600x1200: 13pps |
||
- Zuletzt bearbeitet von YellowRider am Mi, Jan 04, 2006 19:24, insgesamt einmal bearbeitet
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
21pps bei 1152x864 | ||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auf meinem "Zuhause-Rechner" (siehe Signatur) komme ich bei ebenfalls 1280x1024 auf 12 ![]() |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
19pps bei 1280x800
19pps bei 1024x768 |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cool,
aber ich wundere mich gerade über YFlipPixmap(FinalPixmap) ![]() |
||
![]() |
Suco-X |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: aber ich wundere mich gerade über YFlipPixmap(FinalPixmap) Und ich wunderte mich, dass die Pixmap ohne YFlipPixmap auf dem Kopf stand ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
45 bei 1024 * 768 | ||
![]() |
Plasma(alt)Betreff: lol |
![]() Antworten mit Zitat ![]() |
---|---|---|
klugscheiß an
bmp sind verkehrt rum gespeichert . klugscheiß aus |
||
DIV is dead ! |
![]() |
klinBetreff: sry.. |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei der Funktion desktopPixmap aus dem desktopext-Modul handelt es sich um die gleiche Funktion hier aus diesem Thread ![]() |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group