Dobrý den právě vytvářím pro kamaráda program ve VB.NET, který bude zpracovávat obrázky získané printscreenem obrazovky počítače. Jelikož je však standardní printscreen ve VB.NET příliš pomalý a já potřebuji z pracovávat cca. 2-3 obrázky za sekundu, použil ke snímání obrazovky API. Jako výsledek mám obrázek jako Image, ten mohu pomocí marshal-copy zkopírovat do pole a přístup k jednotlivým pixelům je pak velice jednoduchý. Nicméně se mi tento přístup zdá zbytečně zdlouhavý. Nešlo by "pole pixelů" vytvořit přímo z hBitmap, resp. nějakým odkazem na hBitmap. Problém je hlavně v tom, že nechápu jak celý postup viz. kód níže vlastně funguje. Omlouvám se nepřesnosti při popisu, jsem programátor amatér. Děkuji za jakékoliv připomínky a rady. J.B. Kód je zde: pozn. není můj vlastní a bohužel si již nevzpomínám odkud jsem ho získal
' get te hDC of the target window
Dim hdcSrc As IntPtr = User32.GetWindowDC(handle)
' get the size
Dim windowRect As New User32.RECT()
User32.GetWindowRect(handle, windowRect)
Dim width As Integer = windowRect.right - windowRect.left
Dim height As Integer = windowRect.bottom - windowRect.top
' create a device context we can copy to
Dim hdcDest As IntPtr = GDI32.CreateCompatibleDC(hdcSrc)
' create a bitmap we can copy it to,
' using GetDeviceCaps to get the width/height
Dim hBitmap As IntPtr = GDI32.CreateCompatibleBitmap(hdcSrc, width, height)
' select the bitmap object
Dim hOld As IntPtr = GDI32.SelectObject(hdcDest, hBitmap)
' bitblt over
GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY)
' restore selection
GDI32.SelectObject(hdcDest, hOld)
' clean up
GDI32.DeleteDC(hdcDest)
User32.ReleaseDC(handle, hdcSrc)
' get a .NET image object for it
Dim img As Image = Image.FromHbitmap(hBitmap)
' free up the Bitmap object
GDI32.DeleteObject(hBitmap)
|