• 这个周末恒大金碧天下邀您一起看童年的马戏节 2019-03-11
  • 苦瓜-热门标签-华商生活 2019-03-10
  • 承载历史使命的 “乡村振兴”,城乡共同参与 2019-03-05
  • 从穿工装相亲到出门被嘲笑 新飞电器员工口述企业兴衰史 2019-03-05
  • Lorgane législatif national adopte la loi sur la supervision 2019-02-20
  • 俄罗斯世界杯 完全观战手册 2019-02-17
  • 萨拉赫,你再不上 埃及队就要回家啦 2019-02-17
  • 牢牢抓住新时代广东发展的关键重点——三论认真学习贯彻省委十二届四次全会精神 2019-02-16
  • 娜扎谈分手张翰“想不起来了” 安全感全来自妈妈 2019-02-13
  • 敲黑板!“信息公开”不是“隐私公开”! 2019-02-13
  • 点击天山网 掌握全新疆 2019-02-10
  • 在美中国留学生江玥被枪杀案宣判 罪犯获刑25年 2019-02-10
  • 探索记忆之谜 科学家成功向海兔移植记忆 2019-02-08
  • 皇帝的女神:《雍正十二美人图》中的隐秘审美与渴望 2019-02-02
  • [大笑]是谁在炒呢?你们不参与,能炒得起来么? 2019-02-02
  • Jquery中文网 南粤风采36选7开奖公告 www.77402m.com
    Jquery中文网 >  脚本编程  >  C语言  >  正文 C语言解析BMP文件的结构

    最快广东南粤风彩36选7:C语言解析BMP文件的结构

    发布时间:2018-11-20   编辑:南粤风采36选7开奖公告 www.77402m.com
    jquery中文网为您提供C语言解析BMP文件的结构等资源,欢迎您收藏本站,我们将为您提供最新的C语言解析BMP文件的结构资源
    <script>ec(2);</script>

    南粤风采36选7开奖公告 www.77402m.com Windows   GDI提供了  
      typedef   struct   tagBITMAPFILEHEADER   {    
          WORD         bfType;    
          DWORD       bfSize;    
          WORD         bfReserved1;    
          WORD         bfReserved2;    
          DWORD       bfOffBits;    
      }   BITMAPFILEHEADER,   *PBITMAPFILEHEADER;    
    BMP信息头BITMAPINFO结构为:

    typedef struct tagBITMAPINFO {
        BITMAPINFOHEADER    bmiHeader;
        RGBQUAD             bmiColors[1];
    } BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

    typedef struct tagBITMAPCOREINFO {
        BITMAPCOREHEADER    bmciHeader;
        RGBTRIPLE           bmciColors[1];
    } BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;

    #include <pshpack2.h>
    typedef struct tagBITMAPFILEHEADER {
            WORD    bfType;
            DWORD   bfSize;
            WORD    bfReserved1;
            WORD    bfReserved2;
            DWORD   bfOffBits;
    } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

    有一次,一个朋友给了一套BMP文字的图片,想把BMP转化为字库,需要去掉BMP的头和BMP信息,只取数据部分,并存为数组,就根据BMP结构,写了如下一个小程序,主要包括文件读写,文件查找等:

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <windows.h>

    BITMAPFILEHEADER file_head;
    BITMAPINFO fileinfo;

    //把彩色的图转为黑白色,输入源文件名字和转出的文件名字
    #define FONT_WIDTH_1 (28)
    #define FONT_WIDTH_2 (22)


    char * getfilename(char * filename)
    {
     char strResult[128]={0}; //保存结果
     char *temp, *ret;
     temp = filename;
     int nStrLen = strlen(filename); //原始字符串长度
     for(int i = nStrLen; i > 0; i--) //倒查,每个字符和反斜杠对比
     {
      if (filename[i] == '\')    //如果当前字符是反斜杠
      {
       //复制倒数第一个斜杠后的数据,并去掉.bmp
       strncpy(strResult, (char *)(temp i 1), nStrLen-i-1-4); break;
      }
      else
      {
       //复制字符串,去掉.bmp
       if (i = 1)
       {
        strncpy(strResult, (char *)temp, nStrLen-4);
        break;
       }
      }
     }
     ret = strResult;
     return (ret); 
    }
    #if 1
    char * getfilepath(char * filename)
    {
     char strResult[128] = {0}; //保存结果
     char *temp, *ret;
     temp = filename;
     int nStrLen = strlen(filename); //原始字符串长度
     for(int i = nStrLen; i > 0; i--) //倒查,每个字符和斜杠对比
     {
      if (filename[i] == '\') //如果当前字符是斜杠
      {
       //复制路径,包括斜杠
       strncpy(strResult, (char *)temp, i 1);
       break;
      }
     
     }
     ret = strResult;
     return (ret); 
    }
    #endif
    int colorbmp2bwbmp(char * f_in, char * f_out)
    {
     
     int infileLen;            //文件长度
     int n=0;                  //n 字节计数器
     unsigned char c,c_in;     //C_in文件字节,C转化
     FILE *fh_in;
     FILE *fh_out;
     
     assert((f_in != NULL) && (f_out != NULL));
     
     fh_in=fopen(f_in,"rb");
     if (NULL==fh_in)
     {
      printf("open read file error!!");
      return 1;
     }
     
     fseek(fh_in,0,SEEK_END);
     infileLen=ftell(fh_in);
     fseek(fh_in,0,SEEK_SET);
     
     /*read bmp file head,14 BYTE*/
     if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))
     {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
     }
     /*判断是不是BMP文件*/
     if (file_head.bfType!=0x4d42)
     {
      printf("bmp file error!!");
      fclose(fh_in);
      return 1;
     }
     /*文件指针移到文件开始处*/
     fseek(fh_in,0,SEEK_SET);
     
     
     fh_out=fopen(f_out,"wb");
     if (NULL==fh_out)
     {
      printf("open write file error!!");
      return 1;
     }
     /*把文件头读入目标文件*/
     while((int)file_head.bfOffBits--)
     {
      c_in=getc(fh_in);
      c=c_in;
      putc(c,fh_out);
     }
     /*转为黑白片*/
     while (n<(infileLen-(int)file_head.bfOffBits))
     {
      c_in=getc(fh_in);
      c=c_in;
     
      if (c>0x7f)
      {
       c =0xff;
      }
      else
      {
       c = 0x00;
      }
      putc(c,fh_out);
     
      n ;
     
     }
     fclose(fh_in);
     fclose(fh_out);
     return 0;
    }
    //byte转为BIT
    void ByteToBit(char *Out, const char *In, unsigned char bits)
    {
        unsigned char i;

     

        for(i=0; i<bits; i )
        {
            Out[i] = (In[i/8]>>(i%8)) & 1;
        }
    }
    //BIT转为byte
    void BitToByte(char * Out, const char *In, unsigned bits)
    {
        unsigned char i;

        memset(Out, 0, (bits 7)/8);
        for(i=0; i<bits; i )
        {
            Out[i/8] |= In[i]<<(i%8);
        }
    }

    //把位图转为文件,输入bmp文件名和头文件名
    int bmp2headfile(char * bmpfile, char * headfile)
    {
     int infileLen;             //文件长度
     int n=0,num=1;             //n 字节计数器, NUM换行指示
     unsigned char c, c_in;     //C_in文件字节,C转化
     FILE *fh_in;
     FILE *fh_out;
     char com[256]={0};
     char ch[2]={0};
     long wid, hig;
     
     assert((bmpfile != NULL) && (headfile != NULL));
     
     fh_in=fopen(bmpfile,"rb");
     if (NULL==fh_in)
     {
      printf("open read file error!!");
      return 1;
     }
     
     fseek(fh_in,0,SEEK_END);
     infileLen=ftell(fh_in);
     fseek(fh_in,0,SEEK_SET);
     
     /*读取BMP文件头*/
     if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))
     {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
     }
     /*读取BMP文件信息*/
     if (sizeof(fileinfo)!=fread(&fileinfo,1,sizeof(fileinfo),fh_in))
     {
      printf("read bmp file error!!");
      fclose(fh_in);
      return 1;
     }
     /*判断是不是BMP图片*/
     if (file_head.bfType!=0x4d42)
     {
      printf("bmp file error!!");
      fclose(fh_in);
      return 1;
     }
     
     fseek(fh_in,file_head.bfOffBits,SEEK_SET);
     
     fh_out=fopen(headfile,"ab");
     if (NULL==fh_out)
     {
      printf("open write file error!!");
      return 1;
     }
     /*写入注释*/
     memcpy(ch, getfilename(bmpfile), sizeof(getfilename(bmpfile)));
     wid = fileinfo.bmiHeader.biWidth;
     hig = fileinfo.bmiHeader.biHeight;
     sprintf(com, "/*The size is :%dX%d. The char is : %s.*/", wid, hig, ch);
     fputs(com, fh_out);
     putc(0x0d,fh_out);
     putc('n',fh_out);
     /*写入数据*/
     while (n<(infileLen-(int)file_head.bfOffBits))
     {
      putc('0',fh_out);
      putc('X',fh_out);
      c_in=getc(fh_in);
      c=c_in;
     
      c=(c>>4)&0x0f;        //获取高四个BIT的内容
      if (c<0x0a)
      {
    &nbsp;  c =0x30;        //把符号转成数字
      }
      else
      {
       c =0x37;         //转成a到f
      }
      putc(c,fh_out);
      c=c_in&0x0f;    //获取低四个BIT内容
      if (c<0x0a)
      {
       c =0x30;
      }
      else
      {
       c =0x37;
      }
      putc(c,fh_out);
      putc(',',fh_out);
      n ;
     
      if (num % (fileinfo.bmiHeader.biWidth/8 1) ==0)
      {
       putc(0x0d,fh_out);
       putc('n',fh_out);
      }
     
     
     }
     putc(0x0d,fh_out);
     putc('n',fh_out);
     
     fclose(fh_in);
     fclose(fh_out);
     return 0;
    }

     

    int main(int argc, char* argv[])
    {
     WIN32_FIND_DATA fd;
     
     if (argc>2)
     {
      printf("***************位图帮助***************n");
      printf("bmptofile [drive:][path][filename]");
      return 1;
     }
     else if (argc == 2)
     {
      if (strchr(argv[1], '.')!=NULL)
      {
       bmp2headfile(argv[1], (char *)"font.h");
      }
      else //if (memcmp(argv[1], "?", sizeof(argv[1])) == 0)
      {
       printf("***************位图帮助***************n");
       printf("bmptofile [drive:][path][filename]");
       return 1;
      }
     }
     else if (argc == 1)
     {
      HANDLE hd=::FindFirstFile((LPCTSTR)"*.bmp",&fd);  //开始查找
      if(hd==INVALID_HANDLE_VALUE)
      {
       printf("没有找到文件");
       return 0;
      }
      bmp2headfile(fd.cFileName, (char *)"font.h");
      while(FindNextFile(hd,&fd)) //继续查找
      {
       bmp2headfile(fd.cFileName, (char *)"font.h");
      }
      FindClose(hd);//关闭查找
     }
     
     return 0;
    }

    您可能感兴趣的文章:
    JavaScript 面向对象(OOP)的语法参考
    解析Javascript继承机制的设计思想
    jQuery动画效果animate和scrollTop结合使用实例
    批处理的语句结构
    AWK 简介与例子
    jQuery 行级解析读取XML文件(附源码)
    导出mysql 数据结构的例子
    PostgreSQL从菜鸟到专家系列教程(1)PostgreSQL介绍
    golang标准库flag包实现实现命令行解析
    深入解析 Javascript 面向对象编程

    [关闭]
  • 这个周末恒大金碧天下邀您一起看童年的马戏节 2019-03-11
  • 苦瓜-热门标签-华商生活 2019-03-10
  • 承载历史使命的 “乡村振兴”,城乡共同参与 2019-03-05
  • 从穿工装相亲到出门被嘲笑 新飞电器员工口述企业兴衰史 2019-03-05
  • Lorgane législatif national adopte la loi sur la supervision 2019-02-20
  • 俄罗斯世界杯 完全观战手册 2019-02-17
  • 萨拉赫,你再不上 埃及队就要回家啦 2019-02-17
  • 牢牢抓住新时代广东发展的关键重点——三论认真学习贯彻省委十二届四次全会精神 2019-02-16
  • 娜扎谈分手张翰“想不起来了” 安全感全来自妈妈 2019-02-13
  • 敲黑板!“信息公开”不是“隐私公开”! 2019-02-13
  • 点击天山网 掌握全新疆 2019-02-10
  • 在美中国留学生江玥被枪杀案宣判 罪犯获刑25年 2019-02-10
  • 探索记忆之谜 科学家成功向海兔移植记忆 2019-02-08
  • 皇帝的女神:《雍正十二美人图》中的隐秘审美与渴望 2019-02-02
  • [大笑]是谁在炒呢?你们不参与,能炒得起来么? 2019-02-02