我正在尝试将单色xbm文件的数据(每8像素1字节,表示每像素1位)转换为C中每像素1字节的内存位图表示。我该怎么办?

[更新]
到目前为止,我一直在尝试(没有成功)以下方面的东西:

#define IMAGE_WIDTH 769
#define IMAGE_HEIGHT 14

static void uncompress_bm(unsigned char** buf, int* w, int* h)
{
    *w = IMAGE_WIDTH; *h = IMAGE_HEIGHT;
    unsigned int num_pixels = (*w) * (*h);
    *buf = malloc(num_pixels * sizeof(char));
    memset(*buf, 0, num_pixels * sizeof(char));
    for (unsigned int i = 0; i < num_pixels; ++i) {
        unsigned short data_bit = image_data_bits2[i / 8];
        (*buf)[i] = (data_bit & (1 << (i % 8))) ? 255 : 0;
    }
}

unsigned char image_data_bits[] = {
  0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF,
  0x01, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF,
  0xFF, 0x01, 0xC9, 0x9C, 0xF9, 0x40, 0x98, 0x0F, 0xE4, 0xE4, 0xCF, 0x7F,
  0xFE, 0xFF, 0xFF, 0x39, 0x1C, 0x0E, 0x1C, 0x38, 0x73, 0x80, 0xC3, 0x01,
  0x0E, 0x1F, 0xFE, 0xFF, 0xFC, 0xF3, 0x81, 0x0F, 0x7C, 0x38, 0xF0, 0xE1,
  0xC0, 0x81, 0xC0, 0x81, 0x3C, 0xF9, 0x93, 0x27, 0x9F, 0x9F, 0xFC, 0x1C,
  0x0E, 0x7C, 0x38, 0xF0, 0x81, 0x40, 0x9E, 0xFC, 0xE4, 0x27, 0x3F, 0xF9,
  0x09, 0x84, 0x7C, 0xC8, 0xFC, 0xCF, 0x87, 0x03, 0x1F, 0x0E, 0x1C, 0x08,
  0x1C, 0xC8, 0x93, 0x3F, 0x79, 0xF2, 0xF9, 0xC9, 0xCF, 0xE1, 0xC0, 0x87,
  0x03, 0x1F, 0x08, 0xE4, 0xC9, 0x4F, 0x7E, 0xF2, 0x93, 0x9F, 0xC0, 0x21,
  0xE1, 0x33, 0x01, 0xC9, 0x9C, 0xF9, 0x40, 0x98, 0x0F, 0xE4, 0xE4, 0xCF,
  0x7F, 0xFE, 0xFF, 0xFF, 0x39, 0x1C, 0x0E, 0x1C, 0x38, 0x73, 0x80, 0xC3,
  0x01, 0x0E, 0x1F, 0xFE, 0xFF, 0xFC, 0xF3, 0x81, 0x0F, 0x7C, 0x38, 0xF0,
  0xE1, 0xC0, 0x81, 0xC0, 0x81, 0x3C, 0xF9, 0x93, 0x27, 0x9F, 0x9F, 0xFC,
  0x1C, 0x0E, 0x7C, 0x38, 0xF0, 0x81, 0x40, 0x9E, 0xFC, 0xE4, 0x27, 0x3F,
  0xF9, 0x09, 0x84, 0x7C, 0xC8, 0xFC, 0xCF, 0x87, 0x03, 0x1F, 0x0E, 0x1C,
  0x08, 0x1C, 0xC8, 0x93, 0x3F, 0x79, 0xF2, 0xF9, 0xC9, 0xCF, 0xE1, 0xC0,
  0x87, 0x03, 0x1F, 0x08, 0xE4, 0xC9, 0x4F, 0x7E, 0xF2, 0x93, 0x9F, 0xC0,
  0x21, 0xE1, 0x33, 0x01, 0xC9, 0x04, 0x20, 0x7F, 0x98, 0xF3, 0x27, 0x9F,
  0xCC, 0x7C, 0xFE, 0xFF, 0xFF, 0xC9, 0x73, 0xFE, 0xF3, 0x27, 0x73, 0xFE,
  0xFC, 0x7F, 0xF2, 0xE4, 0xC9, 0x39, 0x07, 0xCE, 0x7F, 0x32, 0x93, 0x27,
  0x4F, 0x9E, 0x3C, 0xF9, 0x7C, 0xFE, 0x3C, 0xF9, 0x93, 0x39, 0x1F, 0x86,
  0xF0, 0xE4, 0xC9, 0x93, 0x27, 0x4F, 0xFE, 0x73, 0x9E, 0xFC, 0x64, 0xE6,
  0xCC, 0x67, 0xFE, 0xE4, 0xFC, 0xF9, 0xFF, 0x3F, 0x79, 0xF2, 0xE4, 0xC9,
  0x93, 0xCF, 0xE7, 0xCF, 0x93, 0x3F, 0x99, 0xF3, 0x61, 0x08, 0x4F, 0x9E,
  0x3C, 0x79, 0xF2, 0xE4, 0x3F, 0xE7, 0xC9, 0x4F, 0x66, 0xCE, 0x7C, 0xE6,
  0xCF, 0x39, 0xE7, 0xCC, 0x01, 0xC9, 0x04, 0x20, 0x7F, 0x98, 0xF3, 0x27,
  0x9F, 0xCC, 0x7C, 0xFE, 0xFF, 0xFF, 0xC9, 0x73, 0xFE, 0xF3, 0x27, 0x73,
  0xFE, 0xFC, 0x7F, 0xF2, 0xE4, 0xC9, 0x39, 0x07, 0xCE, 0x7F, 0x32, 0x93,
  0x27, 0x4F, 0x9E, 0x3C, 0xF9, 0x7C, 0xFE, 0x3C, 0xF9, 0x93, 0x39, 0x1F,
  0x86, 0xF0, 0xE4, 0xC9, 0x93, 0x27, 0x4F, 0xFE, 0x73, 0x9E, 0xFC, 0x64,
  0xE6, 0xCC, 0x67, 0xFE, 0xE4, 0xFC, 0xF9, 0xFF, 0x3F, 0x79, 0xF2, 0xE4,
  0xC9, 0x93, 0xCF, 0xE7, 0xCF, 0x93, 0x3F, 0x99, 0xF3, 0x61, 0x08, 0x4F,
  0x9E, 0x3C, 0x79, 0xF2, 0xE4, 0x3F, 0xE7, 0xC9, 0x4F, 0x66, 0xCE, 0x7C,
  0xE6, 0xCF, 0x39, 0xE7, 0xCC, 0x01, 0xF9, 0x9F, 0xF9, 0xF0, 0xE7, 0x0F,
  0x3F, 0x9F, 0x03, 0x07, 0xE0, 0x07, 0x7E, 0xCE, 0x73, 0x3E, 0x7C, 0x38,
  0x40, 0xE0, 0xC0, 0x9F, 0x0F, 0x1F, 0xF8, 0xCF, 0xFF, 0x3F, 0x87, 0x33,
  0x1C, 0x20, 0x40, 0xFE, 0x3C, 0x81, 0x40, 0x86, 0x00, 0xF9, 0x13, 0x3E,
  0x9F, 0x99, 0xCC, 0xE4, 0x09, 0x9C, 0x27, 0xF0, 0xE1, 0x73, 0x9E, 0x33,
  0x67, 0xE6, 0xF3, 0x9F, 0x3F, 0xE7, 0xF3, 0xF9, 0xFF, 0xFF, 0x01, 0x02,
  0xE4, 0xCF, 0x13, 0x08, 0x64, 0x08, 0x90, 0x3F, 0xE1, 0xF3, 0x99, 0xC9,
  0x4C, 0x9E, 0xC0, 0x79, 0x02, 0x1F, 0x3E, 0xE7, 0x39, 0x73, 0x66, 0x3E,
  0xFF, 0xF9, 0x73, 0x3E, 0x9F, 0xFF, 0x01, 0xF9, 0x9F, 0xF9, 0xF0, 0xE7,
  0x0F, 0x3F, 0x9F, 0x03, 0x07, 0xE0, 0x07, 0x7E, 0xCE, 0x73, 0x3E, 0x7C,
  0x38, 0x40, 0xE0, 0xC0, 0x9F, 0x0F, 0x1F, 0xF8, 0xCF, 0xFF, 0x3F, 0x87,
  0x33, 0x1C, 0x20, 0x40, 0xFE, 0x3C, 0x81, 0x40, 0x86, 0x00, 0xF9, 0x13,
  0x3E, 0x9F, 0x99, 0xCC, 0xE4, 0x09, 0x9C, 0x27, 0xF0, 0xE1, 0x73, 0x9E,
  0x33, 0x67, 0xE6, 0xF3, 0x9F, 0x3F, 0xE7, 0xF3, 0xF9, 0xFF, 0xFF, 0x01,
  0x02, 0xE4, 0xCF, 0x13, 0x08, 0x64, 0x08, 0x90, 0x3F, 0xE1, 0xF3, 0x99,
  0xC9, 0x4C, 0x9E, 0xC0, 0x79, 0x02, 0x1F, 0x3E, 0xE7, 0x39, 0x73, 0x66,
  0x3E, 0xFF, 0xF9, 0x73, 0x3E, 0x9F, 0xFF, 0x01, 0xFF, 0x07, 0xE0, 0xCF,
  0x19, 0xF2, 0x3F, 0x9F, 0xCC, 0x7C, 0xFE, 0xFF, 0x9F, 0xCF, 0x73, 0xCE,
  0xFF, 0xE7, 0xF3, 0x9F, 0x3C, 0xE7, 0xF3, 0xFC, 0xC9, 0x39, 0x07, 0xCE,
  0xFF, 0xF3, 0x9F, 0x27, 0x4F, 0x9E, 0x3C, 0xF9, 0x7C, 0x9E, 0x3C, 0xC9,
  0x93, 0x39, 0x9F, 0x9F, 0x3C, 0xE4, 0xC9, 0x9F, 0x27, 0xF3, 0x9F, 0x73,
  0x9E, 0x33, 0x67, 0xE6, 0xCC, 0x9F, 0xCF, 0xE7, 0xCF, 0xF9, 0xFF, 0xFF,
  0x79, 0xF2, 0xE4, 0xC9, 0x93, 0xCF, 0xE7, 0xC9, 0x93, 0x3C, 0x99, 0xF3,
  0xF9, 0xC9, 0x43, 0x9E, 0xFC, 0x79, 0x32, 0xFF, 0x39, 0xE7, 0x39, 0x73,
  0x66, 0xCE, 0xFC, 0xF9, 0xFC, 0x39, 0xE7, 0xFF, 0x01, 0xFF, 0x07, 0xE0,
  0xCF, 0x19, 0xF2, 0x3F, 0x9F, 0xCC, 0x7C, 0xFE, 0xFF, 0x9F, 0xCF, 0x73,
  0xCE, 0xFF, 0xE7, 0xF3, 0x9F, 0x3C, 0xE7, 0xF3, 0xFC, 0xC9, 0x39, 0x07,
  0xCE, 0xFF, 0xF3, 0x9F, 0x27, 0x4F, 0x9E, 0x3C, 0xF9, 0x7C, 0x9E, 0x3C,
  0xC9, 0x93, 0x39, 0x9F, 0x9F, 0x3C, 0xE4, 0xC9, 0x9F, 0x27, 0xF3, 0x9F,
  0x73, 0x9E, 0x33, 0x67, 0xE6, 0xCC, 0x9F, 0xCF, 0xE7, 0xCF, 0xF9, 0xFF,
  0xFF, 0x79, 0xF2, 0xE4, 0xC9, 0x93, 0xCF, 0xE7, 0xC9, 0x93, 0x3C, 0x99,
  0xF3, 0xF9, 0xC9, 0x43, 0x9E, 0xFC, 0x79, 0x32, 0xFF, 0x39, 0xE7, 0x39,
  0x73, 0x66, 0xCE, 0xFC, 0xF9, 0xFC, 0x39, 0xE7, 0xFF, 0x01, 0xF9, 0x9F,
  0x39, 0xF0, 0x19, 0x0E, 0xFC, 0xE4, 0xCF, 0x7F, 0xFE, 0xFC, 0x93, 0x3F,
  0x1C, 0x08, 0x10, 0xF8, 0x73, 0xE0, 0xC3, 0xE7, 0x0F, 0x1F, 0x7E, 0xFE,
  0xFC, 0xF3, 0xE7, 0x0F, 0x9C, 0x27, 0xF0, 0xE1, 0xC0, 0x81, 0xFC, 0xE1,
  0x3C, 0x39, 0x9C, 0x27, 0x90, 0x9F, 0xFC, 0x1C, 0xCE, 0x7F, 0x38, 0x4F,
  0xE0, 0xF3, 0xE1, 0xCF, 0x9F, 0x39, 0x3F, 0x9F, 0x0F, 0x84, 0x4F, 0xF8,
  0xFF, 0xFF, 0x79, 0x02, 0x1F, 0x0E, 0x1C, 0xC8, 0x1F, 0xCE, 0x93, 0xC3,
  0x79, 0x02, 0xF9, 0xC9, 0xCF, 0xE1, 0xFC, 0x87, 0xF3, 0x04, 0x3E, 0x1F,
  0xFE, 0xFC, 0x99, 0xF3, 0xF3, 0xF9, 0xC0, 0x21, 0xE1, 0xFF, 0x01, 0xF9,
  0x9F, 0x39, 0xF0, 0x19, 0x0E, 0xFC, 0xE4, 0xCF, 0x7F, 0xFE, 0xFC, 0x93,
  0x3F, 0x1C, 0x08, 0x10, 0xF8, 0x73, 0xE0, 0xC3, 0xE7, 0x0F, 0x1F, 0x7E,
  0xFE, 0xFC, 0xF3, 0xE7, 0x0F, 0x9C, 0x27, 0xF0, 0xE1, 0xC0, 0x81, 0xFC,
  0xE1, 0x3C, 0x39, 0x9C, 0x27, 0x90, 0x9F, 0xFC, 0x1C, 0xCE, 0x7F, 0x38,
  0x4F, 0xE0, 0xF3, 0xE1, 0xCF, 0x9F, 0x39, 0x3F, 0x9F, 0x0F, 0x84, 0x4F,
  0xF8, 0xFF, 0xFF, 0x79, 0x02, 0x1F, 0x0E, 0x1C, 0xC8, 0x1F, 0xCE, 0x93,
  0xC3, 0x79, 0x02, 0xF9, 0xC9, 0xCF, 0xE1, 0xFC, 0x87, 0xF3, 0x04, 0x3E,
  0x1F, 0xFE, 0xFC, 0x99, 0xF3, 0xF3, 0xF9, 0xC0, 0x21, 0xE1, 0xFF, 0x01,
  0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF,
  0x01, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF,
  0xFF, 0x01,
};

最佳答案

看起来,xbm格式包含8位对齐的行。
一个有效的示例实现如下:

static void uncompress_bm(unsigned char** buf, int* w, int* h)
{
    *w = IMAGE_WIDTH; *h = IMAGE_HEIGHT;
    /* Align width to 8 byte boundary */
    *w = (*w) + (8 - (*w) % 8);
    unsigned int num_pixels = (*w) * (*h);
    *buf = malloc(num_pixels * sizeof(char));
    memset(*buf, 0, num_pixels * sizeof(char));
    for (int i = 0; i < *h; ++i) {
        for (int j = 0; j < *w; ++j) {
            unsigned int cur = i * (*w) + j;
            (*buf)[cur] = (image_data_bits[cur / 8] & (1 << (cur % 8))) ? 255 : 0;
        }
    }
}

10-06 14:28