Monochrome Bitmap Setpixel / GetPixel Проблемы ... Win32 C Code Code
Вопрос
Это какой-то из моего битового кода (монохромные растровые изображения). Нет проблем с функцией bitmask_create (). Я проверил его с открытием, погрузкой и сохранению Windows Monochrome Bitmaps, и он отлично работает. Тем не менее, функции 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;
}
Не связан с StackOverflow