Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[DirectX, C++] Pobieranie wartości koloru piksela z powierzchni

Ostatnio zmodyfikowano 2011-08-31 07:30
Autor Wiadomość
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.

C/C++
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;
    }
   
    // Get the swap-chain surface.
    hr = m_pSwapChain->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, & pSurf );
    if( FAILED( hr ) ) { goto done; }
   
    // Lock the swap-chain surface.
    hr = pSurf->LockRect( & lr, NULL, D3DLOCK_NOSYSLOCK );
    if( FAILED( hr ) ) { goto done; }
   
    // Convert the frame. This also copies it to the Direct3D surface.
   
    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; }
   
   
    // Color fill the back buffer.
    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; }
   
   
    // Blit the frame.
   
    hr = m_pDevice->StretchRect( pSurf, NULL, pBB, & m_rcDest, D3DTEXF_LINEAR );
   
    if( FAILED( hr ) ) { goto done; }
   
   
    // Present the frame.
   
    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ęść

C/C++
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?
P-38230
DejaVu
» 2011-08-06 11:27:27
Sprawdź czy to dotyczy problemu o którym piszesz:
http://www.powerbasic.com/support/pbforums/showthread.php?t=17640
P-38238
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.
P-39394
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.
C/C++
unsigned kolor = 0x12345678;
int b = kolor & 0xff;
kolor >>= 8;
int g = kolor & 0xff;
kolor >>= 8;
int b = kolor & 0xff;
kolor >>= 8;
int a = kolor;
P-39398
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
P-40261
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) :)
P-40312
« 1 »
  Strona 1 z 1