文件名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. 常用正则表达式(?i)忽略字母的大小写!

    1.^/d+$ //匹配非负整数(正整数 + 0) 2.^[0-9]*[1-9][0-9]*$ //匹配正整数 3.^((-/d+)|(0+))$ //匹配非正整数(负整数 + 0) 4.^-[0-9 ...

  2. log4j与commons-logging,slf4j的关系

    前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...

  3. The Storage Situation: Removable Storage

    http://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html There is a lot of co ...

  4. Python 处理理时间超详细转的

    # -*- coding: utf-8 -*- import time def timestamp_datetime(value):    format = '%Y-%m-%d %H:%M:%S'   ...

  5. SQL 标量函数-----日期函数datediff()、 day() 、month()、year()

    select day(createtime) from life_unite_product     --取时间字段的天值 select month(createtime) from life_uni ...

  6. 运行时(iOS)

    运行时(iOS)   一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得 ...

  7. uva10098 Generating Fast, Sorted Permutation

    #include"iostream"#include"stdio.h"#include"string.h"#include"alg ...

  8. PHP Execute Command Bypass Disable_functions

    先简单说一下php调用mail()函数的过程. 看到源码ext/mail.c 236行: char *sendmail_path = INI_STR("sendmail_path" ...

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

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

  10. CodeForces 86D Powerful array(莫队+优化)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...