DesktopBuffer für Blitz3D
Übersicht

ChristianKBetreff: DesktopBuffer für Blitz3D |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit der desktopbuffer.dll kann man schnell auf die einzelnen Pixel des Desktops zugreifen.
Sie kann zum Beispiel für Screenshot-Funktionen genutzt werden. Es werden nur vier Funktionen benötigt: InitDesktopBuffer( ) GetDesktopBuffer( ) GetDesktopPixel( x, y ) GrabDesktop( buffer, x, y, w, h, dx, dy ) In den Beispieldateien wird gezeigt, wie man die Funktionen anwendet. Download |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
- Zuletzt bearbeitet von ChristianK am So, Feb 27, 2011 13:33, insgesamt 4-mal bearbeitet
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Funktioniert super und im Gegensatz zu anderen Funktionen ist diese auch recht schnell. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Immer wieder ein Genuss, deine Libs,ChristianK! ![]() |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Interessant.
Mich würde nun doch aber mal der Sourcecode der DLL interessieren ![]() Vorallem dann, wenn es schneller ist als die WinAPI-Funktionen, die ich bereits benutzt habe. (Benutze eh nurnoch BMax.) |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaub der Unterschied kommt daher, weil diese DLL ein Capture macht auf welchen Buffer man zugreifen kann, während per WinAPI der Buffer immer aktuell bleibt. Für viele Sachen wird aber nicht immer ein aktueller Desktop benötigt (z.B. ein teiltransparentes Startbildinfo).
edit1: Eben noch GetDesktopBuffer() in die Schleife gelegt und festgestellt, dass es immer noch wesentlich schneller ist, als ein reiner WinAPI -Aufruf. Also für meine Zwecke absolut Top! |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau, die DLL kopiert alle Pixel auf einmal in den Speicher ( GetDesktopBuffer ) und liest sie deshalb auch direkt wieder aus dem Speicher heraus ( GetDesktopPixel ).
#Reaper, ich nehme an, du hast GetPixel verwendet. Die Funktion ist unter XP schon langsam, aber unter Vista garnicht mehr zu gebrauchen. ![]() Der größte "Speedkiller" an meiner Methode ist die WritePixel-Funktion. Wenn man ein Bild direkt aus den Pixeldaten erstellen könnte, wäre die DLL sogar fast realtime-tauglich. ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
GetPixel habe ich auch nicht verwendet, sondern BitBlt usw.
Hier der Source (welcher natürlich nicht von mir ist): Code: [AUSKLAPPEN] 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 FinalPixmap = CreatePixmap(info.biWidth, info.biHeight, PF_BGR888) 'MemCopy(FinalPixmap.PixelPtr(0,0), hdcDesktop, Info.biHeight*Info.biWidth*4) 'Print "Src: "+ROP_SRCCOPY If Not BitBlt(hdcMem,0,0,Info.biWidth,Info.biHeight, hdcDesktop,0,0,ROP_SRCCOPY) Return Null EndIf 'Print MilliSecs()-ms If Not GetDIBits(hdcMem, bmpMem, 0, Info.biHeight, FinalPixmap.PixelPtr(0,0), info, 0) Return Null EndIf 'Print MilliSecs()-ms 'MemCopy(FinalPixmap.PixelPtr(0,0), bmpMem, 1280*1024*4) FinalPixmap = YFlipPixmap(FinalPixmap) DeleteDC(HdcMem) DeleteObject(bmpMem) ReleaseDC(hwndDesktop, hdcDesktop) Und das ist nicht sonderlich schnell, mit ~50ms pro Bild. ![]() |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann man...schau dir mal meine PPPNG Lib an. Dort lade ich eine PNG und kopiere die Daten ebenfalls direkt in einen Buffer. Vormals hab ich das auch über WritePixel erledigt, dann aber im englischen Forum (oder hier ???) die nötigen Adressen gefunden um das direkt zu kopieren.
Ich kann dir da gerne behilflich sein ![]() |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
#Reaper,
so ähnlich hab ich das auch in der DLL gemacht, allerdings verwende ich nicht GetDIBits, sondern greife direkt auf den Buffer zu. Vielleicht macht das einen Unterschied. EPS, PPPNG kenn ich natürlich, aber ich dachte, das geht nur mit FreeImage bzw. Texturen. ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hat so direkt nix mit FastImage zu tun. Der Knackpunkt ist der direkte Zugriff auf den Buffer - ok, in meinem Fall Texturebuffer - geht aber auch mit einem Image. Allerdings spreche ich hier von BB - nicht von BMax.
Wie auch immer ich poste hier mal einen Code der dir weiterhelfen dürfte: Code: [AUSKLAPPEN] ;Image pixel data offset
Include "MemoryAccess.bb" Graphics 640,480,0,2 SetBuffer BackBuffer() image=LoadImage("test.bmp") ;8x8 bufferimage=ImageBuffer(image) WritePixel 0,0,33,bufferimage WritePixel 1,0,44,bufferimage WritePixel 2,0,55,bufferimage width=PeekI(bufferimage+92) ;bufferimage+28 for Blitz+ not tested !! height=PeekI(bufferimage+96) ;bufferimage+32 videoaddress=PeekI(bufferimage+72) ;bufferimage+76 Dim pixel(8,8) pixel(0,0)=PeekB(videoaddress) pixel(1,0)=PeekB(videoaddress+4) pixel(2,0)=PeekB(videoaddress+8) Print "bufferimage="+bufferimage Print "width="+width Print "height="+height Print "videoaddress="+videoaddress Print "pixel(0,0)="+pixel(0,0) Print "pixel(1,0)="+pixel(1,0) Print "pixel(2,0)="+pixel(2,0) Print "" For offset=0 To 12-1 byte=PeekB(videoaddress+offset) Print "address="+(videoaddress+offset)+" byte="+byte Next Print "" For offset=0 To 12-1 Step 4 rgba=PeekI(videoaddress+offset) PokeI(videoaddress+offset,$FF0000) ;Red Print "address="+(videoaddress+offset)+" rgba="+rgba Next Print "" Print "Let's see what we poked in" For offset=0 To 12-1 Step 4 rgba=PeekI(videoaddress+offset) Print "address="+(videoaddress+offset)+" rgba="+Hex(rgba) Next DrawImage image,256,16 WaitKey() End |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, ich hab jetzt noch eine neue Funktion: GrabDesktop eingebaut.
Damit kann man den Inhalt des Desktops in einen beliebigen Buffer kopieren, was noch ein bisschen schneller ist, als die Daten Pixel für Pixel zu schreiben. EPS, danke für den Code. Ich hab es zwar etwas anders gemacht, aber das ist trotzdem hilfreich. ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Echt super!!!
Vielleicht könntest du auch noch Funktionen anschaffen um die Höhe und die Breite des Desktops zu ermitteln. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Userlib
Code: [AUSKLAPPEN] .lib "user32.dll"
GetSystemMetrics%( index% ) Code Code: [AUSKLAPPEN] Local breite = GetSystemMetrics( 0 )
Local hoehe = GetSystemMetrics( 1 ) ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
GrabDesktop(buffer, x,y, w, h) setzt das x/y -Offset am Zielbuffer (Image), nicht wie erwartet auf dem Quellbuffer (Desktop).
Ist das so beabsichtigt? Code: [AUSKLAPPEN] ; DesktopBuffer initialisieren InitDesktopBuffer( ) Graphics 800, 600, 0, 2 Local w = GraphicsWidth( ) Local h = GraphicsHeight( ) ;Local img = CreateImage( w, h ) Local img = CreateImage( 200, 200 ) MaskImage img,255,0,255 ; Desktop in den ImageBuffer von "img" kopieren GrabDesktop( ImageBuffer( img ), 50, 50, 100, 100 ) While Not KeyDown( 1 ) Cls Color 64,64,64:Rect 0,0,w,h,1 DrawImage img, MouseX(), MouseY() Flip Wend End |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
War so beabsichtigt, aber eigentlich sinnlos. ![]() Ich hab jetzt noch zwei Parameter hinzugefügt -> dx und dy Die geben die Position auf dem Zielbuffer an. Die Parameter x und y beschreiben jetzt die Position auf dem Quellbuffer. Danke für den Hinweis. ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Perfekt! Danke für die DLL. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
GetDesktopPixel() funktioniert bei mir (Windos Vista Ultimate 64bit, NVIDIA GeForce 9600GT) nicht. Es gibt nur schwarze Pixel zurück. Weisst du einen Rat? MfG |
||
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Toll!
Als nächstes könntest du dir ja vornehmen eine DLL zu schreiben mit der ich russische/amerikanische langstrecken/atom raketen weit weg ins Universum steuern kann ![]() Herzlichen Dank. |
||
WIP: Vorx.Engine |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nici, hast du vorher auch GetDesktopBuffer aufgerufen? | ||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
barratator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ComNik: Das hat er doch schon längst...Du solltest öfters die Worklogs lesen.
Aber kurz vor dem Release kamen so grüne Männchen von der Intergalactic Nature Conservation Organisation und meinten, dass die DLL erst weitergeschrieben werden darf, wenn endlich seine MarsTerraforming.DLL fertig ist. Und diese hat z.Z. noch kleine Probleme, wenn auf dem Rechner Vista läuft (Microsoft meint, dass der User sogar Adminrechte braucht, wenn er so eine Kleinigkeit macht... ![]() Gruß Bastian |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group