DesktopBuffer für Blitz3D

Übersicht BlitzBasic DLLs und Userlibs

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

ChristianK

Betreff: DesktopBuffer für Blitz3D

BeitragSa, März 15, 2008 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 15, 2008 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert super und im Gegensatz zu anderen Funktionen ist diese auch recht schnell. Exclamation
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

The_Nici

BeitragSa, März 15, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer wieder ein Genuss, deine Libs,ChristianK! Wink
 

#Reaper

Newsposter

BeitragSa, März 15, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant.
Mich würde nun doch aber mal der Sourcecode der DLL interessieren Smile
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 15, 2008 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 15, 2008 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

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. Smile
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
 

#Reaper

Newsposter

BeitragSa, März 15, 2008 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Confused
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

BeitragSa, März 15, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.
 

ChristianK

BeitragSa, März 15, 2008 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
#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. Question
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

BeitragSa, März 15, 2008 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 16, 2008 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
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

BeitragSo, März 16, 2008 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 16, 2008 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Userlib

Code: [AUSKLAPPEN]
.lib "user32.dll"
GetSystemMetrics%( index% )

Code

Code: [AUSKLAPPEN]
Local breite = GetSystemMetrics( 0 )
Local hoehe = GetSystemMetrics( 1 )

Wink
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 16, 2008 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 16, 2008 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
War so beabsichtigt, aber eigentlich sinnlos. Smile
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. Smile
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 16, 2008 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Perfekt! Danke für die DLL.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

The_Nici

BeitragMi, Jul 15, 2009 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 15, 2009 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing

Herzlichen Dank.
WIP: Vorx.Engine
 

ChristianK

BeitragMi, Jul 15, 2009 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jul 15, 2009 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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...Sad ).


Gruß
Bastian

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group