C 如何将单色xbm位图数据转换为1通道8bpp图像?

C 如何将单色xbm位图数据转换为1通道8bpp图像?,c,image,bitmap,C,Image,Bitmap,我正在尝试将单色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;

我正在尝试将单色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,
};
#定义图像宽度769
#定义图像_高度14
静态无效解压缩(无符号字符**buf,int*w,int*h)
{
*w=图像宽度;*h=图像高度;
无符号整数像素=(*w)*(*h);
*buf=malloc(num_像素*sizeof(char));
memset(*buf,0,num_像素*sizeof(char));
对于(无符号整数i=0;i(*buf)[i]=(看起来,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;
        }
    }
}
静态无效解压缩\u bm(无符号字符**buf,int*w,int*h)
{
*w=图像宽度;*h=图像高度;
/*将宽度与8字节边界对齐*/
*w=(*w)+(8-(*w)%8);
无符号整数像素=(*w)*(*h);
*buf=malloc(num_像素*sizeof(char));
memset(*buf,0,num_像素*sizeof(char));
对于(int i=0;i<*h;++i){
对于(int j=0;j<*w;++j){
无符号整数cur=i*(*w)+j;

(*buf)[cur]=(image_data_bits[cur/8]&(1)通过编写适当的代码……好的,更严肃地说,向我们展示您迄今为止所做的工作,然后就您遇到困难的部分提出具体问题。我认为应该是
unsigned char data_bits=image_data_bits[I/8]
顺便说一句,它是一条标点符号,数字0-9和字母表(两次)。像这样。。。