Проблемы монохромного растрового изображения SetPixel / GetPixel ... Win32 C Code - PullRequest
1 голос
/ 13 декабря 2010

Это мой код битовой маски (монохромные растровые изображения). Нет проблем с функцией Bitmask_Create (). Я проверил его с открытием, загрузкой и сохранением оконных монохромных растровых изображений, и он прекрасно работает. Однако созданные мной функции 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;
}

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Я думаю, что ваша формула для расчета высоты тона немного отклонена. Это работает, когда ширина кратна 8, но не иначе. Попробуйте:

nPitch = ((nWidth + 31) / 8) & ~3;
0 голосов
/ 13 декабря 2010

Я понял это ... У меня было два теста назад для nPixelColor в SetPixel ()

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