文件名mybmp.c

//实现了读取24位BMP文件,还有一些测试信息

 //定义mybmp.c里面用到的函数和相关头文件、常量
//参考了网友sailinghz在CSDN论坛的帖子:http://bbs.csdn.net/topics/220060950 #include <stdio.h>
#include <stdlib.h> /*定义U16为两个字节的类型*/
typedef unsigned short U16;
/*定义U32为四个字节的类型*/
typedef unsigned long U32; /*位图文件头*/
typedef struct BMP_FILE_HEADER
{
unsigned bType:; /* 文件标识符 */
unsigned bSize:; /* 文件的大小 */
unsigned bReserved1:; /* 保留值,必须设置为0 */
unsigned bReserved2:; /* 保留值,必须设置为0 */
unsigned bOffset:; /* 文件头的最后到图像数据位开始的偏移量 */
} BMPFILEHEADER; /*位图信息头*/
typedef struct BMP_INFO
{
U32 bInfoSize; /* 信息头的大小 */
U32 bWidth; /* 图像的宽度 */
U32 bHeight; /* 图像的高度 */
U16 bPlanes; /* 图像的位面数 */
U16 bBitCount; /* 每个像素的位数 */
U32 bCompression; /* 压缩类型 */
U32 bmpImageSize; /* 图像的大小,以字节为单位 */
U32 bXPelsPerMeter; /* 水平分辨率 */
U32 bYPelsPerMeter; /* 垂直分辨率 */
U32 bClrUsed; /* 使用的色彩数 */
U32 bClrImportant; /* 重要的颜色数 */
} BMPINF; /*彩色表*/
typedef struct RGB_QUAD
{
U16 rgbBlue; /* 蓝色强度 */
U16 rgbGreen; /* 绿色强度 */
U16 rgbRed; /* 红色强度 */
U16 rgbReversed; /* 保留值 */
} RGBQUAD; int myLoadImage(unsigned char *image, char *filename); //只能读取24位的位图
int myLoadImage(unsigned char *image, char *filename)
{
FILE *fp; //文件指针
BMPFILEHEADER fileHeader; //位图文件头
BMPINF infoHeader; //位图信息头
long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount;
int i = , j, count = ;
int lcount = ;
int cl[] = {};
// unsigned char **p;
U16 c; char fname_bmp[];
sprintf(fname_bmp, "%s", filename);
printf("FileName:%s\n",fname_bmp); if((fp = fopen(fname_bmp, "rb")) == NULL)
{
printf("Cann't open the file!\n");
return -; //读取失败,直接返回
} fseek(fp, 54L, ); //指定偏移量
fread(&fileHeader, sizeof(fileHeader), , fp); //读取文件头
fread(&infoHeader, sizeof(infoHeader), , fp); //读取位图信息头 //system("pause"); //暂停 /*
printf("typedef struct BMP_FILE_HEADER\n");
printf("{\n");
printf(" U16 bType; #%04x * 文件标识符 *\n",fileHeader.bType);
printf(" U32 bSize; #%08x * 文件的大小 *\n",fileHeader.bSize);
printf(" U16 bReserved1;#%04x * 保留值,必须设置为0 *\n",fileHeader.bReserved1);
printf(" U16 bReserved2;#%04x * 保留值,必须设置为0 *\n",fileHeader.bReserved2);
printf(" U32 bOffset; #%08x * 文件头的最后到图像数据位开始的偏移量*\n",fileHeader.bOffset);
printf("} BMPFILEHEADER;%d个字节\n",sizeof(fileHeader));
*/ /*
printf("typedef struct BMP_INFO\n");
printf("{\n");
printf(" U32 bInfoSize; #%08x /* 信息头的大小 *\n",infoHeader.bInfoSize);
printf(" U32 bWidth; #%08x /* 图像的宽度 *\n",infoHeader.bWidth);
printf(" U32 bHeight; #%08x /* 图像的高度 *\n",infoHeader.bHeight);
printf(" U16 bPlanes; #%04x /* 图像的位面数 *\n",infoHeader.bPlanes);
printf(" U16 bBitCount; #%04x /* 每个像素的位数 *\n",infoHeader.bBitCount);
printf(" U32 bCompression; #%08x /* 压缩类型 *\n",infoHeader.bClrImportant);
printf(" U32 bmpImageSize; #%08x /* 图像的大小,以字节为单位 *\n",infoHeader.bmpImageSize);
printf(" U32 bXPelsPerMeter; #%08x /* 水平分辨率 *\n",infoHeader.bXPelsPerMeter);
printf(" U32 bYPelsPerMeter; #%08x /* 垂直分辨率 *\n",infoHeader.bYPelsPerMeter);
printf(" U32 bClrUsed; #%08x /* 使用的色彩数 *\n",infoHeader.bClrUsed);
printf(" U32 bClrImportant; #%08x /* 重要的颜色数 *\n",infoHeader.bClrImportant);
printf("} BMPINF;%d个字节\n\n",sizeof(infoHeader));
*/ //printf("unsigned short:%d\n",8*sizeof(U16));
//printf("unsigned long:%d\n",8*sizeof(U32)); printf("Size:%d个字节\n",sizeof(infoHeader) + sizeof(fileHeader)); //计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
/*size = fileHeader.bSize;
offset = fileHeader.bOffset;
bmpImageSize = infoHeader.bmpImageSize;
width = infoHeader.bWidth;
height = infoHeader.bHeight;
bitCount = infoHeader.bBitCount;
bytesPerPixel = infoHeader.bBitCount / 8;*/ //输出基本信息,文件信息 & 位图信息
//printf("bSize:%#x\nbOffset:%#x\n\bmpImageSize:%#x\nbWidth:%#x\nbHeight:%#x\nbBitCount:%#x\nbytesPerPixel:%#x\n", \
size, offset, bmpImageSize, width, height, bitCount, bytesPerPixel); //system("pause"); //暂停 //fread(&image, sizeof(unsigned char), (size_t)(long)width*height*3, fp); //直接读取像素信息给image数组 //输出每个像素点所占字节中的内容
c = fgetc(fp); //直接输出
while (!feof(fp))
{
cl[count] = fgetc(fp);
count++;
if (count == ) //读一个像素
{
lcount++;
c = (unsigned char)((cl[]* + cl[]* +cl[]*+ )/); //BGR 2 GRAY
printf("%d",c>?:);
image[i] = (c>?:) + ;
i++;
count = ;
if (lcount == )
{
printf("\n");
lcount = ;
}
} } printf("\ncount = %d\n",count); //格式输出
/*for (i = 0; i<64; i++)
{
for (j = 0; j<64; j++)
{
cl[0] = fgetc(fp);
cl[1] = fgetc(fp);
cl[2] = fgetc(fp);
c = (unsigned char)((cl[0]*11 + cl[1]*59 +cl[2]*30+ 50)/100);
printf("%d", c>0?1:0);
//image[i][j] = c; //直接给image
}
printf("\n");
}*/ printf("\n"); //system("pause"); //暂停 fclose(fp); printf("Call myLoadImage() Ok!\n"); return ;
}

代码片段:2014年2月7日

[代码片段]读取BMP文件的更多相关文章

  1. [代码片段]读取BMP文件(二)

    #include <stdio.h> #include <stdlib.h> #pragma pack(2) /*定义WORD为两个字节的类型*/ typedef unsign ...

  2. WEB应用中普通java代码如何读取资源文件

    首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题:   ...

  3. Spring用代码来读取properties文件

    我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org.springframework.beans.factory.config.PropertyP ...

  4. java代码如何读取properties文件

    我们在开发工程中,有时候需要在Java代码中定义一些在部署生产环境时容易改变的变量,还需要我们单独放在一个外部属性文件中,方便我们将来修改.这里列出了两种比较方便的方式. 一.在Spring配置文件中 ...

  5. (转)Spring用代码来读取properties文件

    转至http://www.cnblogs.com/Gyoung/p/5507063.html 我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org ...

  6. 代码片段---判断一文件是不是字符设备如果是把它拷贝到 /dev目录下

    #!/bin/sh myfile=/home/liu 这个是文件的路径 fd = `ls -l myfile` 获取文件的所有属性 fp= ${fd::} if ["$fp" = ...

  7. 代码生成器的关键代码(读取PDM文件)

    /// <summary> /// 处理PDM文件 /// </summary> public class DoPDMDal:IDoDataBaseDal { public L ...

  8. Spark Scala 读取GBK文件的方法

    1. 在生产环境下,很多文件是GBK编码格式的,而SPARK 常用的textFile方法默认是写死了读UTF-8格式的文件,其他格式文件会显示乱码 用如下代码实现读取GBK文件的方法 import o ...

  9. sublime自定义snippet代码片段

    相信很多人喜欢sublime编辑工具有两个原因:第一sublime很轻巧方便:第二sublime提供很多自定义拓展功能,包括很简单且和很好用的代码片段功能snippet文件. 今天,在这里就介绍下su ...

随机推荐

  1. shell 之for [转]

    本文也即<Learning the bash Shell>3rd Edition的第五章Flow Control之读书笔记之二,但我们将不限于此.flow control是任何编程语言中很 ...

  2. virsh命令

    查看虚拟机: [root@super67 ~]# virsh list Id    Name                           State --------------------- ...

  3. PHP将在对象被销毁前调用这个函数.它称为析构函数

    -构造函数和析构函数 如果你在一个类中声明一个函数,命名为__construct,这个函数将被当成是一个构造函数并在建立一个对象实例时被执行.清楚地说,__是两个下划线.就像其它任何函数一样,构造函数 ...

  4. HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 投芯片,现在要n+1模式

    给坚持理想的屌丝点个赞.投芯片,现在要n+1模式,n个小项目+一个大项目.团队是基础,屌丝创业要以营利为先导,先要短快,同时要有并行的大项目支撑.小项目赚的钱先解决面包问题,同时为大项目锻炼队伍积累经 ...

  6. PHP ip 查找 城市名

    PHP ip 查找 城市名 header("content-type:text/html;charset=utf-8");date_default_timezone_set(&qu ...

  7. HttpStatusCodeResult

    HttpStatusCodeResult:让mvc回传特定的http状态代码与消息给客户端,对于一些特殊的http响应,可利用httpStatusCodeResult帮助我们响应适当的状态代码: 1X ...

  8. laravle faker

    1.编辑 /database/factories/ModelFactory,添加新的类模型填充 $factory->define(App\Post::class, function (Faker ...

  9. communicate with other processes, regardless of where they are running

    Advanced Programming in the UNIX Environment Third Edition   In the previous chapter, we looked at p ...

  10. Machine Learning in Action -- AdaBoost

    初始的想法就是,结合不同的分类算法来给出综合的结果,会比较准确一些 称为ensemble methods or meta-algorithms,集成方法或元算法 集成方法有很多种,可以是不同算法之间的 ...