OpenGL织梦之旅【第三章】第1节.纹理贴图

       在了解纹理贴图之前,我们先要对BMP位图文件要有一定的了解。在Windows中,BMP格式是一个很常见的图像文件储存格式。位图文件由4个部分构成:位图文件头,位图信息头,彩色表以及定义位图的字节列阵。24位的真彩色图像不使用彩色表,所以可以暂时不用管它。

   我们写个函数

int LoadBitmap(constchar *file)


      图像bmp文件的地址是file,返回值int我们等一下再说为什么。

      在windows.h中,定义了两个结构体BITMAPFILEHEADERBITMAPINFOHEADER分别表示位图文件头和位图信息头。然后在定义一个byte数组image用于读入位图的数据信息。Widthheight用于接受图像的长宽(单位:像素)。注意:每个像素因为由RGB三种不同光组合而成,所以实际上image数组保存数据的长度是width*height*3

int width,height,i;

   byte *image;          //接受图像数据

   FILE *fp;             //文件指针

   BITMAPFILEHEADER FileHeader;     //接受位图文件头

   BITMAPINFOHEADER InfoHeader;     //接受位图信息头

   fp=fopen(file,"rb");

   if (fp == NULL)

   {

      perror("LoadBitmap");        //打开文件失败

      return -1;

   }

   fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

   if(FileHeader.bfType != BITMAP_ID)   //确保文件是一个位图文件,效验文件类型

   { 

      printf("Error: This file is not a bmp file!");

      fclose(fp);

      return -1;

   }

   fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);

   width=InfoHeader.biWidth; 

   height=InfoHeader.biHeight;

   if (InfoHeader.biSizeImage == 0)           //确保图像数据的大小

    {

      InfoHeader.biSizeImage = width*height*3;

   }

   fseek(fp, FileHeader.bfOffBits, SEEK_SET);  //将文件指针移动到实际图像数据处

   image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage); //申请空间

   if (image == NULL)

   {

      free(image);

      printf("Error: No enough space!");

      return -1;

   }

   fread(image, 1, InfoHeader.biSizeImage, fp);  


      

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值