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

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

#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 = 0i <IMAGE_SIZEi++)

{

*(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文件数据指针

shortbmp_header = 0x4D42// bmp文件头字

shortbmp_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 = 0i <IMAGE_SIZEi++)

{

*(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文件数据指针

shortbmp_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)

}

PBM格式全名:portable bitmap,是一种图形格式。在PS6.0中就已经增加了对其的导入支持。也就是说,在其后的版本中把图片导入后,另存即可完成新格式的转换...

如果楼主的PS不能打开 那么试试用别的软件,比如用ACDSee转换成别的格式,再导入PS打开


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12031608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存