文件名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. "504 Gateway Time-out"

    "504 Gateway Time-out”是什么意思? 意思为:网关超时!

  2. T-SQL查询进阶--深入浅出视图

    视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata. 视图简 ...

  3. [转].net 缩略图方法

    本文转自:http://www.cnblogs.com/promic/archive/2010/04/21/1717190.html private static string strConnect ...

  4. 分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  5. 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图

    有的时候,我们需要Excel中的数据,通过一个图画,可视化的表现出来. 那么这个时候,应该如何做呢?现在就借花献佛,以Apache POI自己提供的一个例子为例,给大家演示一下POI的API 如何画图 ...

  6. [听课笔记]Professor Michael Cusumano's New Book:" Strategy Rules: Five Timeless Lessons from Bill Gates, Andy Grove, and Steve Jobs"

    1. Look Forward, Reason Back Extrapolate, interpret, then tie vision to concrete actions2. Make Big ...

  7. GitHub 初探

    前言:有时候在公司上班时自己写了一些代码,打算下班回家后继续写,或者在家修改好的代码第二天要拷到公司继续完善,代码就经常要在这两者之间来回同步,通常情况下我用网盘或者U盘,但是实在是很麻烦,不断的备份 ...

  8. maven编译项目理解

    如何运行这个Web项目? 右键项目名称,在弹出的选项中选择 Run As => Maven install,然后 Eclise 会下载并安装相关依赖包.在等待一段时间后,构建成功的结果如下:

  9. 微信的User-Agent

    Mozilla/5.0 (Linux; U; Android 5.0.2; zh-cn; MI 2C Build/LRX22G) AppleWebKit/533.1 (KHTML, like Geck ...

  10. spotlight监控工具使用

    利用spotlight工具可以监控如下系统:        1.Spotlight on Unix 监控Linux服务器 1)安装 Spotlight on Unix 2)配置spotlight登陆用 ...