单色位图SetPixel / GetPixel问题Win32 C代码

这是我的一些位掩码(单色位图)。 Bitmask_Create()函数没有问题。 我已经testing了打开,加载和保存窗口单色位图,它工作的很好。 但是,我所做的GetPixel和SetPixel函数似乎并不正确。 在某些情况下,他们似乎工作正常取决于位图维度。

如果有人可以帮忙,我将不胜感激。 这让我疯狂。 谢谢。

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; } 

我认为你计算球场的公式只是一点点。 它在宽度是8的倍数的情况下起作用,但是否则不起作用。 尝试:

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

我想通了…我有两个测试向后的nPixelColor SetPixel()

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