文件名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. Linux启动过程中几个重要配置文件的执行过程

    Linux 登录后,配置执行顺序为(Debian Serials Capable):/etc/environment -> /etc/profile -> (~/.bash_profile ...

  2. hudson安装

    Hudson 只是一个持续集成服务器(持续集成工具),要想搭建一套完整的持续集成管理平台,  SVN.Maven.Sonar 等工具按需求整合则可.   1. 安装 JDK 并配置环境变量(略)  J ...

  3. BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][ ...

  4. 前端CSS参考阅读

    CSS 2.2 W3标准 http://dev.w3.org/csswg/css2/ CSS2 中文翻译 http://files.cnblogs.com/files/mize/CSS2_Chines ...

  5. vim vi 及其相关插件的使用

    GIMP->linux下16位图查看工具 实用手册:130+ 提高开发效率的 vim 常用命令 http://www.cnblogs.com/lhb25/p/130-essential-vim- ...

  6. 39. 求分数序列前N项和

    求分数序列前N项和 #include <stdio.h> int main() { int i, n; double numerator, denominator, item, sum, ...

  7. PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入

    1.安装 PDO 数据库抽象层 PDO - PHP Data Object 扩展类库为 PHP 访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,针对不同的数据库服务器使用特定的 ...

  8. 【翻译】Kinect v1和Kinect v2的彻底比较

      本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较.   ...

  9. PHP--进行模块化设计

    PHP--进行模块化设计 [来源] 达内    [编辑] 达内   [时间]2012-10-30 导航模块可以简单列为一个关于三级页面链接的HTML文件.通常你可以通过用另一种颜色来标明对当前区域的链 ...

  10. Oracle数据库常用命令

    导出表数据 exp user/pwd@dbname file=filename.dmp tables=tbl_name rows=y indexes=n triggers=n grants=n 导入表 ...