vs2008读取位图

今天,在看代码的时候,遇到了读取位图格式信息时出现了一些问题,先讲一下几个函数:

1、文件打开函数:

在定义FILE * fp 之后,fopen的用法是: fp = fopen(filename,"w")。而对于fopen_s来说,还得定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,"w")。返回值的话,对于fopen来说,打开文件成功的话返回文件指针(赋值给fp),打开失败则返回NULL值;对于fopen_s来说,打开文件成功返回0,失败返回非0。这个程序我用的是fopen_s,如果用fopen 则会出现一个警告;

2、exit()退出函数:

C语言中exit()用法

exit在stdio.h里面,所以要有包含头文件
return是返回函数调用,如果返回的是main函数,则为退出程序
exit是在调用处强行退出程序,运行一次程序就结束
-------------------------------------------------------------------
return;

是返回

函数返回
而exit是退出
-------------------------------------------------------------------
exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值
exit(0)表示正常退出
-------------------------------------------------------------------
无论写在那里,都是程序退出,dos和windows中没有什么不一样,最多是系统处理的不一样。
数字0,1,-1会被写入环境变量ERRORLEVEL,其它程序可以由此判断程序结束状态。
一般0为正常推出,其它数字为异常,其对应的错误可以自己指定。
-------------------------------------------------------------------
返回给操作系统的,0是正常退出,其他值是异常退出,在退出前可以给出一些提示信息,或在调试程序中察看出错原因.
exit()函数说明来自百度空间 易水寒
3、fseek() 以下内容来自于: http://www.fzs8.net/C_Function/2007-06-13/c_6093.html
函数名: fseek
功  能: 重定位流上的文件指针
用  法: int fseek(FILE *stream, long offset, int fromwhere);
程序例:略(具体应用可以看网址);

fseek()函数用法

jenny 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://wyiceshark.blogbus.com/logs/5323034.html


0001.gif (1095 字节)

    调用形式


  #include"stdio.h"

  fseek(文件类型指针fp,位移量,起始点)

    函数功能:把与 fp 有关的文件位置指针放到一个指定位置。

    其中,“位移量”是long型数据,它表示位置指针相对于“起始点”移动的字节数。如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。

    “起始点”不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:

起始点

对应的数字

  代表的文件位置

SEEK_SET

0  文件开头

SEEK_CUR

1  文件当前位置

SEEK_END

2  文件末尾

    例如:

        fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);

    其作用是将位置指针移到离文件头50个字节处。

4、fread()函数用法:

先可以看看:http://www.fzs8.net/C_Function/2007-06-13/c_6099.html

然后结合:http://blog.163.com/niuyuanyuan_2008/blog/static/1280010472010393475851/中的C++中fread函数和fwrite函数的用法 具体如下:

1.函数功能

用来读写一个数据块。

2.一般调用形式

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

3.说明

(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

(2)size:要读写的字节数;

(3)count:要进行读写多少个size字节的数据项;

(4)fp:文件型指针。

4.例:

1.fread(&id,1,10,f)就是把f里面的值读到id里面,每次读1个字节,一共读10次,或者把id里面的值都读完,不到10次也会停止。

2.fwrite(&id,1,10,f)就是把id里面的值读到f里面,每次读1个字节,一共读10次或是fread(&id,10,1,f)就是把id里面的值读到里面,每次读10个字节,一共读1次。

自己编译程序用vs2008读取位图信息如下:

 

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

int main (int argc, char **argv)
{
 int width = 0, height = 0,i,j,num[3],skip=0,fpskip;
    char *raw=NULL;
 short int bitwidth=0;
 char R,G,B,alp;
 
 FILE *fp = NULL;
    errno_t err  = fopen_s( &fp,"d:\\125.bmp", "rb" );
 if(!fp) exit(2);
 fseek(fp,10L,0);//把fp指针移动到离文件开头10字节处
 fread(&skip,4,1,fp);
 fseek(fp,18L,0);
 fread(num,4,2,fp);
 width=num[0];
 height=num[1];
 fseek(fp,28,0);
 fread(&bitwidth,2,1,fp);
 if(0==width%4)
  fpskip=0;
    else
  fpskip=4-width%4;

 printf("width=%d,height=%d,skip=%d,fpskip=%d\n",num[0],num[1],skip,fpskip);
 raw = (char*)malloc((width) * (height));
 fseek(fp,skip,0);

 if(24==bitwidth)
 {
 for(i=0;i<height;i++)
     { 
    for(j=0;j<width;j++)
     { 
   
     B=fgetc(fp);
     G=fgetc(fp);
     R=fgetc(fp);
    raw[width*(height-i-1)+j]=(299*R+587*G+114*B)/1000;

     }
    fseek(fp,fpskip,1);
     }
 }
 if(32==bitwidth){
 for(i=0;i<height;i++)
 {
  for(j=0;j<width;j++)
  { 
   
    B=fgetc(fp);
    G=fgetc(fp);
    R=fgetc(fp);
    alp=fgetc(fp);
   raw[width*(height-i-1)+j]=(299*R+587*G+114*B)/1000;

  }
  fseek(fp,fpskip,1);
 }
 }

 fclose(fp);/* clean up */

 getchar();
 return 0;
}

结果如下:

在编译程序时,由于自己把.png格式的图片重命名为.bmp,因此直接导致提取位图信息错误,因此,以后希望自己在今后更仔细,加油!



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值