用黑色填充所有位图1bpp

时间:2015-01-06 00:39:04

标签: c bitmap fill

我尝试用黑色填充我的所有位图1bpp,但仍然有一些像素被遗漏。

我用C:

写了那段代码
void fillBlack(void* img, int width, int height)
{

int i=0,j=0;

for(i=0;i<width;i++)
{
    for(j=0;j<(height);j+=8)
    {
        *(char*)(img)=(*((char*)(img))^0xff);
        img++;
    }

}

}

其中img是指向偏移量的指针,所有参数都很好,特别是宽度和高度。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

位图图像由带有像素的扫描线组成。扫描线向上舍入到最近的单词。假设每个字32位:

fillBlack(void *img, int width, int height)
{
  char *bmp = img;
  int i,j, scanlinebytes;

  scanlinebytes= ((width*1)+31) / 32 * 4;    // 1 = bits per pixel

  for (i = 0; i < height; i++) {
    for(j = 0; j < scanlinebytes; j++) {
      *bmp++ = 0;
    }
  }
}

答案 1 :(得分:0)

假设0表示黑色,则您的XOR将翻转任何区域的值。假设您有一个带有二进制值00001000的1字节区域:

black black black black white black black black
white white white white white white white white
-----------------------------------------------
white white white white black white white white

将您的区域归零的等效且更有效的方法是:

char *bmp = img;
memset(bmp, 0, width * (height / 8));

如果1表示黑色,0表示白色(出于某种奇怪的原因):

char *bmp = img;
memset(bmp, 0xff, width * (height / 8));

在任何一种情况下,您都不希望对值进行异或。 XOR翻转不匹配的值。你只想做一个任务。因此,如果由于某种原因没有memset:

void 
fillBlack(void *img, int width, int height)
{
  char *bmp = img;
  int i=0,j=0;

  for (i = 0; i < width; i++) {
    for(j = 0; j < height; j += 8) {
      *bmp++ = 0;
    }
  }
}

(如果黑色是出于某种奇怪的原因而不是0,则再次将*bmp++ = 0;更改为*bmp++ = 1;。)

memset(3)可能在您的系统上进行优化,以便一次处理多个字节,假设您在现代操作系统上运行并且拥有支持此类事物的CPU。

答案 2 :(得分:0)

Each row of pixels must be a multiple of 4 bytes
suggest:

void fillBlack(void* img, int width, int height)
{
    char *pImage = img;
    int i=0;   // loop counter, image height in pixels
    int j=0;   // loop counter, image width in pixels
    int pad=0; // loop counter, pad bytes at end of each row of pixels

    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            *pImage = 0x00;
            pImage++;       // step to next byte in row
        } // end for - width

        // there can be some filler bytes on the end of rows
        // as rows must be a multiple of 4 bytes

        for(pad=0; 0 != (width+pad)%4; pad++)
        {
            *pImage = 0x00;    // set pad byte
            pImage++;          // step by pad byte
        } // end for - pad bytes
    } // end for - height
} // end function: fillBlack