Získání barvy pixelu přímo z hBitmap   zodpovězená otázka

VB.NET, Grafika

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)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak nakonec jsem to vyřešil.

Je to více než jednoduché, stačí použít fci. GetBitmapBits knihovny GDI32.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback