Canvas auslesen? (was nicht von BMax reingeschrieben wurde)

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Suco-X

Betreff: .....

BeitragDi, Aug 28, 2007 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe dir da mal was kleines vorbereitet:

Code: [AUSKLAPPEN]

Strict

Function GetDesktopData:Byte Ptr(MemSize:Int Var, ImgWidth:Int Var, ImgHeight:Int Var)

   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:Int,x:Int,y:Int,w:Int,h:Int,src_dc:Int,src_x:Int,src_y:Int,dwrop:Int)
   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
   
      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
       
     Local Time:Int = MilliSecs()
      If Not BitBlt(hdcMem,0,0,Info.biWidth,Info.biHeight, hdcDesktop,0,0,ROP_SRCCOPY)   
         Return Null
      EndIf

     Time = MilliSecs()-Time
     Print "BlitZeit: "+Time
   
      
     ImgWidth  = Info.biWidth
     ImgHeight = Info.biHeight
     MemSize   = (DesktopWidth*DesktopHeight)*3
      
     Local mem:Byte Ptr = MemAlloc(MemSize)
      
     Time = MilliSecs()   
      
      If Not GetDIBits(hdcMem, bmpMem, 0, Info.biHeight, Mem, info, 0)
         Return Null
      EndIf

      Time = MilliSecs()-Time
      Print "Zeit zum erhalten der Daten durch GetDIBits: "+Time
     

      DeleteDC(HdcMem)
      DeleteObject(bmpMem)
      ReleaseDC(hwndDesktop, hdcDesktop)
       
     Return Mem

   ?
   
   ?Linux
      Return Null
   ?
   
   ?MacOs
      Return Null
   ?
End Function





Local MemSize:Int, ImgWidth:Int, ImgHeight:Int
Local Time_Data:Int, Time_Pixmap:Int


Time_Data = MilliSecs()

'Desktop Daten werden abgeholt und wichtige Informationen werden in den übergebenen Variablen gespeichert
Local Mem:Byte Ptr = GetDesktopData(MemSize, ImgWidth, ImgHeight)

Time_Data = MilliSecs()-Time_data

Print "Groesse der Bilddaten in Bytes: "+MemSize
Print "Bildbreite: "+ImgWidth
Print "Bildhoehe: "+ImgHeight
Print "Zeit zum erhalten der Desktop Farbdaten: "+Time_Data


Time_Pixmap = MilliSecs()


'Daten können übers Netzwerk verschickt werden.


'Die Pixmap wird wieder erstellt. Pitch ist BreiteDesBildes*BytesProByte. Da 24 bit, 3 bytes.
Local Pixmap:TPixmap = CreateStaticPixmap(Mem, ImgWidth, ImgHeight, ImgWidth*3, PF_BGR888)
Pixmap = YFlipPixmap(Pixmap)
 
Time_Pixmap = MilliSecs()-Time_Pixmap

Print "Zeit zum erstellen und Flippen der Pixmap: "+Time_Pixmap


Graphics ImgWidth, ImgHeight,0
DrawPixmap Pixmap, 0,0
Flip
WaitKey()



Da werden alle Zeitdaten usw. aufgelistet. Es gibt noch die Möglichkeit, mit StretchBlt zu Blitten und die Ausgabe zu verkleinern. Würde bei der Übertragung vielleicht etwas Sinn machen, aber die Qualität leidet dann logischerweise drunter und StretchBlt ist langsamer.
Wenn BitBlt langsamer war, muss dir wohl ein Fehler unterlaufen sein. Ist ja das gleiche wie dein CopyRect bei dem BPLus code. GetDIB kannst du mit dem auslesen via ReadPixelFast vergleichen, also schon enormer Speedboost.
Mfg
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

#Reaper

Newsposter

BeitragDi, Aug 28, 2007 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, dein Code geht. Smile Ist zwar leider auch nicht schneller, aber immerhin gibt es ja jetzt auch ein Bild Wink Very Happy

Naja, werde mich wohl vorerst damit zufrieden geben Wink

Vielen Dank Smile
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

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group