您的位置:

c语言写入8位bmp,c语言输出10位数

本文目录一览:

高手指点:用C语言编写一个读写“*.BMP”文件信息的程序

#ifndef BMPRW_H

#define BMPRW_H

typedef struct { // 长度12字节

// short bftype; // 固定为"BM",VC不能读取一个short,故省略

int bfSize; // 位图文件的大小,以字节为单位

short bfReserved1; // 位图文件保留字,必须为0

short bfReserved2; // 位图文件保留字,必须为0

int bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位

} BITMAPFILEHEADER;

typedef struct { // 长度40字节

int biSize; // 本结构所占用字节数,长度40字节

int biWidth; // 位图的宽度,以像素为单位

int biHeight; // 位图的高度,以像素为单位

short biPlanes; // 目标设备的级别,必须为1

short biBitCount; // 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一

int biCompression; // 位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

int biSizeImage; // 位图的大小,以字节为单位

int biXPelsPerMeter; // 位图水平分辨率,每米像素数

int biYPelsPerMeter; // 位图垂直分辨率,每米像素数

int biClrUsed; // 位图实际使用的颜色表中的颜色数

int biClrImportant; // 位图显示过程中重要的颜色数

} BITMAPINFOHEADER;

typedef struct { // 24位真彩色无此结构,256级灰度图长度256*4字节

char rgbBlue; // 蓝色的亮度(值范围为0-255)

char rgbGreen; // 绿色的亮度(值范围为0-255)

char rgbRed; // 红色的亮度(值范围为0-255)

char rgbReserved; // 保留,必须为0

} RGBQUAD;

void ColorBmpR(char*, unsigned char*); // 彩色bmp图像读

void ColorBmpW(char*, char*, unsigned char*); // 彩色bmp图像写

void GrayBmpR (char*, unsigned char*); // 灰度bmp图像读

void GrayBmpW (char*, char*, unsigned char*); // 灰度bmp图像写

#endif

///////////////////////////////////////////////////////////

#include "stdio.h"

#include "stdlib.h"

#include "Common.h"

#include "BmpRW.h"

/*

Copyright: Li Weiwei

VER: 2.00

Function: 读取一幅256灰度的bmp图片入内存

Input: bmp文件名指针,内存中图片数据指针

Output: 无

*/

void GrayBmpR(char *fn, unsigned char *pImage)

{

BITMAPFILEHEADER *pbmpfh; // bmp文件头指针

BITMAPINFOHEADER *pbmpi; // bmp文件信息头指针

unsigned char *pbitstr; // bmp文件数据指针

int i = 0;

// 将bmp文件头文件读入*pbmpfh

FILE *rfile = fopen(fn,"rb+");

pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));

if (!pbmpfh)

{

printf("pbmpfh not enough memory");

}

fseek(rfile,sizeof(short),SEEK_SET);

fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile);

// 将bmp文件信息头文件读入*pbmpi

pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));

if (!pbmpi)

{

printf("pbmpi not enough memory");

}

fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile);

// 将bmp文件数据读入*pbitstr

pbitstr = (unsigned char*) malloc(IMAGE_SIZE);

if (!pbitstr)

{

printf("pbitstr not enough memory");

}

fseek(rfile,pbmpfh-bfOffBits,SEEK_SET);

fread(pbitstr,IMAGE_SIZE,1,rfile);

fclose(rfile);

// 将*pbitstr中数据存入*pImage

for (i = 0; i IMAGE_SIZE; i++)

{

*(pImage+i) = *(pbitstr+i);

}

// 释放不用的内存空间

free(pbitstr);

free(pbmpi);

free(pbmpfh);

}

/*

Copyright: Li Weiwei

VER: 2.00

Function: 读取一幅24位真彩色bmp图片入内存

Input: bmp文件名指针,内存中图片数据指针

Output: 无

*/

void ColorBmpR(char *fn, unsigned char *pImage)

{

BITMAPFILEHEADER *pbmpfh; // bmp文件头指针

BITMAPINFOHEADER *pbmpi; // bmp文件信息头指针

unsigned char *pbitstr; // bmp文件数据指针

int i = 0;

// 将bmp文件头文件读入*pbmpfh

FILE *rfile = fopen(fn,"rb+");

pbmpfh = (BITMAPFILEHEADER*) calloc(1, sizeof(BITMAPFILEHEADER));

if (!pbmpfh)

{

printf("pbmpfh not enough memory");

}

fseek(rfile,sizeof(short),SEEK_SET);

fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile);

// 将bmp文件信息头文件读入*pbmpi

pbmpi = (BITMAPINFOHEADER*) calloc(1, sizeof(BITMAPINFOHEADER));

if (!pbmpi)

{

printf("pbmpi not enough memory");

}

fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile);

// 将bmp文件数据读入*pbitstr

pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3, sizeof(char));

if (!pbitstr)

{

printf("pbitstr not enough memory");

}

fseek(rfile,pbmpfh-bfOffBits,SEEK_SET);

fread(pbitstr,IMAGE_SIZE*3,1,rfile);

fclose(rfile);

// 将*pbitstr中数据存入*pImage

for( i=0 ; i IMAGE_SIZE*3 ; i++ )

{

*(pImage+i) = *(pbitstr+i);

}

// 释放不用的内存空间

free(pbitstr);

free(pbmpi);

free(pbmpfh);

}

/*

Copyright: Li Weiwei

VER: 2.00

Function: 写一幅256灰度的bmp图片入文件

Input: 灰度模板文件名指针,待写入bmp文件名指针,内存中图片数据指针

Output: 无

*/

void GrayBmpW(char *rfn, char *wfn, unsigned char *pImage)

{

BITMAPINFOHEADER *pbmpi; // bmp文件信息头指针

BITMAPFILEHEADER *pbmpfh; // bmp文件头指针

RGBQUAD *pbmprgb; // bmp文件调色板指针

unsigned char *pbitstr; // bmp文件数据指针

short bmp_header = 0x4D42; // bmp文件头字

short bmp_end = 0x0000; // bmp文件尾字

int i = 0;

FILE *rfile = fopen(rfn,"rb+"); // 模板bmp文件指针

FILE *wfile = fopen(wfn,"wb+"); // 生成bmp文件指针

// 将bmp头字写入文件

fseek(wfile,0,SEEK_SET);

fwrite(bmp_header,1,sizeof(short),wfile);

// 将模板bmp文件头文件写入生成文件

pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));

if (!pbmpfh)

{

printf("pbmpfh not enough memory");

}

fseek(rfile,sizeof(short),SEEK_SET);

fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile);

fseek(wfile,sizeof(short),SEEK_SET);

fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile);

// 将模板bmp文件信息头文件写入生成文件

pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));

if (!pbmpi)

{

printf("pbmpi not enough memory");

}

fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile);

fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile);

// 将模板bmp调色板写入生成文件

pbmprgb = (RGBQUAD*) calloc(256,sizeof(RGBQUAD));

if (!pbmprgb)

{

printf("pbmprgb not enough memory");

}

fseek(rfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fread(pbmprgb,256,sizeof(RGBQUAD),rfile);

fclose(rfile); // 关闭模板文件

fseek(wfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fwrite(pbmprgb,sizeof(RGBQUAD),256,wfile);

// 将图像数据pImage写入生成文件

fseek(wfile,pbmpfh-bfOffBits,SEEK_SET);

pbitstr = (unsigned char*) malloc(IMAGE_SIZE);

if (!pbitstr)

{

printf("pbitstr not enough memory");

}

for (i = 0; i IMAGE_SIZE; i++)

{

*(pbitstr+i)=*(pImage+i);

}

fwrite(pbitstr,IMAGE_SIZE,1,wfile);

free(pbitstr);

// 将bmp尾字写入文件

fseek(wfile,0,SEEK_END);

fwrite(bmp_end,1,sizeof(short),wfile);

fclose(wfile); // 关闭生成文件

// 释放不用的内存空间

free(pbmprgb);

free(pbmpi);

free(pbmpfh);

}

/*

Copyright: Li Weiwei

VER: 2.00

Function: 写一幅24位真彩色bmp图片入文件

Input: 24位真彩色模板文件名指针,待写入bmp文件名指针,内存中图片数据指针

Output: 无

*/

void ColorBmpW(char *rfn, char *wfn, unsigned char *pImage)

{

BITMAPFILEHEADER *pbmpfh; // bmp文件头指针

BITMAPINFOHEADER *pbmpi; // bmp文件信息头指针

unsigned char *pbitstr; // bmp文件数据指针

short bmp_header = 0x4D42; // bmp文件头字

int i = 0;

FILE *rfile = fopen(rfn,"rb+"); // 模板bmp文件指针

FILE *wfile = fopen(wfn,"wb+"); // 生成bmp文件指针

// 将bmp头字写入文件

fseek(wfile, 0, SEEK_SET);

fwrite(bmp_header,1,sizeof(short),wfile);

// 将模板bmp文件头文件写入生成文件

pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));

if (!pbmpfh)

{

printf("not enough memory");

}

fseek(rfile,sizeof(short),SEEK_SET);

fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile);

fseek(rfile,sizeof(short),SEEK_SET);

fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile);

// 将模板bmp文件信息头文件写入生成文件

pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));

if (!pbmpi)

{

printf("not enough memory");

}

fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile);

fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);

fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile);

// 将图像数据写入生成文件

pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3,sizeof(char));

if (!pbitstr)

{

printf("not enough memory");

}

// 将*pImage中数据写入*pbitstr

for( i=0 ; i IMAGE_SIZE*3 ; i++ )

{

*(pbitstr+i) = *(pImage+i);

}

fseek(wfile,pbmpfh-bfOffBits,SEEK_SET);

fwrite(pbitstr,IMAGE_SIZE*3,1,wfile);

fclose(wfile);

// 释放不用的内存空间

free(pbitstr);

free(pbmpi);

free(pbmpfh);

}

关于C语言读取8位BMP

fread((char*)bmpPla,sizeof(RGBQUAD),NumColors,fp);

这句有问题,RGBQUAD bmpPla[256]; 本身bmpPla就是个地址(数组变量就是首地址),所以我觉得你改为如下看看是否正确:

fread((char*)bmpPla,sizeof(RGBQUAD),NumColors,fp);

用C语言读取8bit灰度bmp档

bmp格式的图像文件,存放像素格式的方式是从左下角开始,行序存储.

若要实现上下翻转,把像素格式数据按行进行倒排就行了.

涉及的内容有:bmp文件格式(8bit),二进制文件的读写.

附一张1bit灰度的文本解析图: