2010-12-13 68 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 2010-12-13 04:29:24

0

我想通了......我已經落後了兩項測試進行nPixelColor在SetPixel()

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