[代码片段]读取BMP文件
文件名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文件的更多相关文章
- [代码片段]读取BMP文件(二)
#include <stdio.h> #include <stdlib.h> #pragma pack(2) /*定义WORD为两个字节的类型*/ typedef unsign ...
- WEB应用中普通java代码如何读取资源文件
首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题: ...
- Spring用代码来读取properties文件
我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org.springframework.beans.factory.config.PropertyP ...
- java代码如何读取properties文件
我们在开发工程中,有时候需要在Java代码中定义一些在部署生产环境时容易改变的变量,还需要我们单独放在一个外部属性文件中,方便我们将来修改.这里列出了两种比较方便的方式. 一.在Spring配置文件中 ...
- (转)Spring用代码来读取properties文件
转至http://www.cnblogs.com/Gyoung/p/5507063.html 我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org ...
- 代码片段---判断一文件是不是字符设备如果是把它拷贝到 /dev目录下
#!/bin/sh myfile=/home/liu 这个是文件的路径 fd = `ls -l myfile` 获取文件的所有属性 fp= ${fd::} if ["$fp" = ...
- 代码生成器的关键代码(读取PDM文件)
/// <summary> /// 处理PDM文件 /// </summary> public class DoPDMDal:IDoDataBaseDal { public L ...
- Spark Scala 读取GBK文件的方法
1. 在生产环境下,很多文件是GBK编码格式的,而SPARK 常用的textFile方法默认是写死了读UTF-8格式的文件,其他格式文件会显示乱码 用如下代码实现读取GBK文件的方法 import o ...
- sublime自定义snippet代码片段
相信很多人喜欢sublime编辑工具有两个原因:第一sublime很轻巧方便:第二sublime提供很多自定义拓展功能,包括很简单且和很好用的代码片段功能snippet文件. 今天,在这里就介绍下su ...
随机推荐
- "504 Gateway Time-out"
"504 Gateway Time-out”是什么意思? 意思为:网关超时!
- T-SQL查询进阶--深入浅出视图
视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata. 视图简 ...
- [转].net 缩略图方法
本文转自:http://www.cnblogs.com/promic/archive/2010/04/21/1717190.html private static string strConnect ...
- 分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图
有的时候,我们需要Excel中的数据,通过一个图画,可视化的表现出来. 那么这个时候,应该如何做呢?现在就借花献佛,以Apache POI自己提供的一个例子为例,给大家演示一下POI的API 如何画图 ...
- [听课笔记]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 ...
- GitHub 初探
前言:有时候在公司上班时自己写了一些代码,打算下班回家后继续写,或者在家修改好的代码第二天要拷到公司继续完善,代码就经常要在这两者之间来回同步,通常情况下我用网盘或者U盘,但是实在是很麻烦,不断的备份 ...
- maven编译项目理解
如何运行这个Web项目? 右键项目名称,在弹出的选项中选择 Run As => Maven install,然后 Eclise 会下载并安装相关依赖包.在等待一段时间后,构建成功的结果如下:
- 微信的User-Agent
Mozilla/5.0 (Linux; U; Android 5.0.2; zh-cn; MI 2C Build/LRX22G) AppleWebKit/533.1 (KHTML, like Geck ...
- spotlight监控工具使用
利用spotlight工具可以监控如下系统: 1.Spotlight on Unix 监控Linux服务器 1)安装 Spotlight on Unix 2)配置spotlight登陆用 ...