2010-12-13 6 views
1

これは私のビットマスクコード(モノクロビットマップ)の一部です。 Bitmask_Create()関数に問題はありません。私はそれをオープン、ロード、ウィンドウのモノクロビットマップを保存することでテストしました。しかし、私が作ったGetPixelとSetPixel関数はうまく動作しないようです。いくつかの例では、ビットマップの大きさに応じてうまく動作するようです。モノクロビットマップSetPixel/GetPixel問題... Win32 Cコード

誰でも助けることができたら、私はそれを感謝します。私を狂ってしまう。おかげさまで

typedef struct _GL_BITMASK GL_BITMASK; 
struct _GL_BITMASK { 
    int nWidth; // Width in pixels 
    int nHeight; // Height in pixels 
    int nPitch; // Width of scanline in bytes (may have extra padding to align to DWORD) 
    BYTE *pData; // Pointer to the first byte of the first scanline (top down) 
}; 

int BitMask_GetPixel(GL_BITMASK *pBitMask, int x, int y) 
{ 
    INT nElement = ((y * pBitMask->nPitch) + (x/8)); 
    PBYTE pElement = pBitMask->pData + nElement; 
    BYTE bMask = 1 << (7 - (x % 8)); 

    return *pElement & bMask; 
} 

void BitMask_SetPixel(GL_BITMASK *pBitMask, int x, int y, int nPixelColor) 
{ 
    INT nElement = x/8; 
    INT nScanLineOffset = y * pBitMask->nPitch; 
    PBYTE pElement = pBitMask->pData + nScanLineOffset + nElement; 
    BYTE bMask = 1 << (7 - (x % 8)); 

    if(*pElement & bMask) 
    { 
     if(!nPixelColor) return; 
     else *pElement ^= bMask; 
    } 
    else 
    { 
     if(nPixelColor) return; 
     else *pElement |= bMask; 
    } 
} 

GL_BITMASK *BitMask_Create(INT nWidth, INT nHeight) 
{ 
    GL_BITMASK *pBitMask; 
    int nPitch; 

    nPitch = ((nWidth/8) + 3) & ~3; 

    pBitMask = (GL_BITMASK *)GlobalAlloc(GMEM_FIXED, (nPitch * nHeight) + sizeof(GL_BITMASK)); 
    if(!pBitMask) 
     return (GL_BITMASK *)NULL; 

    pBitMask->nPitch = nPitch; 
    pBitMask->nWidth = nWidth; 
    pBitMask->nHeight = nHeight; 
    pBitMask->pData = (PBYTE)pBitMask + sizeof(GL_BITMASK); 

    return pBitMask; 
} 

答えて

1

ピッチを計算するための数式はほんの少しです。これは、幅が8の倍数である場合に機能しますが、それ以外の場合は機能しません。試してみてください:

nPitch = ((nWidth + 31)/8) & ~3; 
+0

私はピッチのコードを変更しましたが、とsetPixelとgetPixelメソッドの機能はまだありません作業...ビットマップを保存すると、すべて黒です...ビットマップ保存機能がうまく動作します。私は、ビットマスクバッファにロードされたビットマップからそれをテストしました。 (アドバイスをいただきありがとうございます) – oldSkool

0

を、私はそれを考え出した...私はとsetPixelにnPixelColorのために後方2つのテストを持っていた()

if(*pElement & bMask) 
{ 
    if(nPixelColor) return; // this was !nPixelColor 
    else *pElement ^= bMask; 
} 
else 
{ 
    if(!nPixelColor) return; // this was nPixelColor 
    else *pElement |= bMask; 
}