我正在尝试将单色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;
}
}
}