[DirectX, C++] Pobieranie wartości koloru piksela z powierzchni
Ostatnio zmodyfikowano 2011-08-31 07:30
bartez1000 Temat założony przez niniejszego użytkownika |
[DirectX, C++] Pobieranie wartości koloru piksela z powierzchni » 2011-08-06 00:41:54 Witam, mam taki kod. HRESULT DrawDevice::DrawFrame( BYTE * pBits ) { HRESULT hr = S_OK; BYTE * pbScanline0 = NULL; LONG lStride = 0; D3DLOCKED_RECT lr; IDirect3DSurface9 * pSurf = NULL; IDirect3DSurface9 * pBB = NULL; if( m_pDevice == NULL || m_pSwapChain == NULL ) { return S_OK; } hr = m_pSwapChain->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, & pSurf ); if( FAILED( hr ) ) { goto done; } hr = pSurf->LockRect( & lr, NULL, D3DLOCK_NOSYSLOCK ); if( FAILED( hr ) ) { goto done; } BYTE * pDst =( BYTE * ) lr.pBits; BYTE * pSrc = pBits; for( int y = 0; y <( int ) m_height; y++ ) { memcpy( pDst, pSrc, m_lDefaultStride ); pDst += lr.Pitch; pSrc += m_lDefaultStride; } hr = pSurf->UnlockRect(); if( FAILED( hr ) ) { goto done; } hr = m_pDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, & pBB ); if( FAILED( hr ) ) { goto done; } hr = m_pDevice->ColorFill( pBB, NULL, D3DCOLOR_XRGB( 0, 0, 0x80 ) ); if( FAILED( hr ) ) { goto done; } hr = m_pDevice->StretchRect( pSurf, NULL, pBB, & m_rcDest, D3DTEXF_LINEAR ); if( FAILED( hr ) ) { goto done; } hr = m_pDevice->Present( NULL, NULL, NULL, NULL ); done: if( pSurf != NULL ) pSurf->Release(); if( pBB != NULL ) pBB->Release(); return hr; } Najbardziej interesuje mnie część hr = pSurf->LockRect( & lr, NULL, D3DLOCK_NOSYSLOCK );
BYTE * pDst =( BYTE * ) lr.pBits; BYTE * pSrc = pBits;
for( int y = 0; y <( int ) m_height; y++ ) { memcpy( pDst, pSrc, m_lDefaultStride ); pDst += lr.Pitch; pSrc += m_lDefaultStride; }
hr = pSurf->UnlockRect();
m_height to wysokość obrazka m_lDefaultStride to "rozmiar" obrazka Program kopiuje linia po linii obraz do prostokąta na buferze powierzchni, a potem odblokowuje powierzchnię. I tu jest moje pytanie : jak "Zdobyć" kolor RGB każdego piksela na obrazku? |
|
DejaVu |
» 2011-08-06 11:27:27 |
|
bartez1000 Temat założony przez niniejszego użytkownika |
» 2011-08-18 02:26:43 Jeszcze sobie nie poradziłem. Format powierzchni to D3DFMT_X8R8G8B8 czyli na każdy pixel przypada najpierw pusty bajt, potem bajt z wartością czerwoną, potem zieloną, a potem niebieską. Mając wartości w bajtach mógłbym zdobyć kolor w typie ColorREF używając makra RGB, ale niezbyt wychodzi mi wyłuskiwanie tych bajtów jeden po drugim. |
|
DejaVu |
» 2011-08-18 08:42:06 Jeżeli umiesz odczytać kolor piksela do postaci np. liczby to potem wystarczy zrobić odpowiednie operacje logiczne, np.
unsigned kolor = 0x12345678; int b = kolor & 0xff; kolor >>= 8; int g = kolor & 0xff; kolor >>= 8; int b = kolor & 0xff; kolor >>= 8; int a = kolor;
|
|
bartez1000 Temat założony przez niniejszego użytkownika |
» 2011-08-30 16:10:33 Problem w tym, że nie wychodzi mi wyciąganie pojedyńczego bajta z pSrc do makra RGB |
|
DejaVu |
» 2011-08-31 07:30:15 Kolor zajmuje 3 albo 4 bajty, a nie 1 bajt (zakładam, że obraz jest 24 lub 32 bitowy) :) |
|
« 1 » |