回复 5楼 TonyDeng
/*****************
1.本函数的功能:实现图像的读取与输出,
文件为bmp文件,分为1位,4位,8位,16位,24位
2.函数的符号定义:fpin:指向读入文件的指针
fpout:指向读出文件的指针
******************/
#include <stdio.h>
/* #include <windows.h>
//直接引用Windows函数功能,直接引用出现了错误,那么我就自己定义好了 */
#include <math.h>
/* */
typedef unsigned short int WORD; //定义函数代称,2个字节
typedef unsigned int DWORD;//定义函数代称,4个字节
typedef char BYTE; //定义函数代称,1个字节
typedef struct tagBITMAPFILEHEADER //文件信息头,一共14个字节
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER //位图信息头,一共40个字节
{
DWORD biSize; //bmiHeader 的结构的长度
DWORD biWidth; //位图的宽度
DWORD biHeight; //位图的高度
WORD biPlanes; //目标设备的位平面数,必须为1
WORD biBitCount; //每个像素的位数,必须是1(单色),4(16色),8(256色),或者24(真彩色)
DWORD biCompression; //位图的压缩类型,必须是0(不压缩),1(BI-RLE8压缩类型)或者2(BI-RLE4压缩类型)
DWORD biSiZelmage; //位图的大小,以字节为单位
DWORD biXPelsPerMeter; //位图的水平分辩率,以每米多少像素为单位
DWORD biYPelsPerMeter; //位图的垂直分辨率
DWORD biClrUsed; // 位图中实际使用的颜色表中的颜色变址数
DWORD biClrImportant; //位图中认为重要的颜色表中的颜色变址数
}BITMAPINFOHEADER;
typedef struct tagRGBQUAD //调色板信息,一共4个字节
{
BYTE rgbBlue; // 取·0-255,
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved; //不代表任何意义,只是保留这个空间
}RGBQUAD;
/*结果验证,就算我自己定义函数,我的错误仍然存在,很奇怪。*/
void main()
{
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBQUAD *palette; //指向调色板的指针
char *img[5000];
int width,sizeofpalette;
void infile(FILE *fpin,BITMAPFILEHEADER fileheader,BITMAPINFOHEADER infoheader,RGBQUAD *palette,char *img[5000],int width,int sizeofpalette);
void outfile(FILE *fpout,BITMAPFILEHEADER fileheader,BITMAPINFOHEADER infoheader,RGBQUAD *palette,char *img[5000],int width,int sizeofpalette);
FILE *fpin,*fpout;
fpin=fopen("D:\\11.bmp","rb"); //在主函数中打开文件
fpout=fopen("D:\\23.bmp","wb");//打开另外一个文件,若是磁盘中存有这个文件,则读进并且覆盖这个磁盘,假如文件夹中没有这个文件,则创立一个新的文件名
if((fpin=fopen("D://11.bmp","rb"))==NULL) //判断是否存在这个文件
printf("Sorry,we cannot find the file!\n");
infile(fpin,fileheader,infoheader,palette,img,width,sizeofpalette); //调用读取函数
outfile(fpout,fileheader,infoheader,palette,img,width,sizeofpalette);//调用读出的函数
fclose(fpin);
fclose(fpout);
}
void infile(FILE *fpin,BITMAPFILEHEADER fileheader,BITMAPINFOHEADER infoheader,RGBQUAD *palette,char *img[5000],int width,int sizeofpalette)//读入图片的函数
{
unsigned int i;
fread(&fileheader,sizeof(BITMAPFILEHEADER),1,fpin); //读入文件信息头
fread(&infoheader,sizeof(BITMAPINFOHEADER),1,fpin); //读入位图信息头
if(infoheader.biBitCount<16) //假如16位以下的像素位数,需要调色板,调色板具有单色位、4色位、8色位、16色位、24色位,没有32色位
{
sizeofpalette=(int(pow(2,(infoheader.biBitCount))))*4;//调色板的大小,等于2的位数次幂,再乘以4
fread(palette,sizeofpalette,1,fpin);
}
/* 开始读入位图数据*/
width=infoheader.biWidth/(32/infoheader.biBitCount)+1;/*至少要读入的横像素的数目,因为一次需要读四个,1位的一次读取32个像素;4位的一次读取8个像素;8位一次读取4个像素;16为一次读取2个像素;32位一次读取1个像素。*/
for(i=0;i<infoheader.biHeight;i++)
fread(img[i],width,1,fpin);
}
void outfile(FILE *fpout,BITMAPFILEHEADER fileheader,BITMAPINFOHEADER infoheader,RGBQUAD *palette,char *img[5000],int width,int sizeofpalette)
{unsigned int i=0;
fwrite(&fileheader,sizeof(BITMAPFILEHEADER),1,fpout);
fwrite(&infoheader,sizeof(BITMAPINFOHEADER),1,fpout);
fwrite(palette,sizeofpalette,1,fpout);
for(i=0;i<infoheader.biHeight;i++)
fwrite(img[i],width,1,fpout);}
/*以上为全部的源代码*/