纯C代码下读写BMP文件代码,简单易懂。 /**/ /*************************************************************** Copyright (c) 2007, Shanghai ** ** 文件名称:read_write_bmp_with_C.c** 编译: Visual C++ / ANSI C / ISO C++** 日期: 2007.10.24**************************************************************/ #include " stdio.h " #include " stdlib.h " #define PIXPLINE 320 typedef struct tagRGBQUAD ... { //定义每个像素的数据类型 unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed;} RGBQUAD; int bmp_read(unsigned char * image, int xsize, int ysize, char * filename) ... { char fname_bmp[128]; sprintf(fname_bmp, "%s.bmp", filename); FILE *fp; if (!(fp = fopen(fname_bmp, "rb"))) return -1; unsigned char header[54]; fread(header, sizeof(unsigned char), 54, fp); fread(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp); fclose(fp); return 0;} int bmp_write(unsigned char * image, int xsize, int ysize, char * filename) ... { unsigned char header[54] = ...{ 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; long file_size = (long)xsize * (long)ysize * 3 + 54; header[2] = (unsigned char)(file_size &0x000000ff); header[3] = (file_size >> 8) & 0x000000ff; header[4] = (file_size >> 16) & 0x000000ff; header[5] = (file_size >> 24) & 0x000000ff; long width = xsize; header[18] = width & 0x000000ff; header[19] = (width >> 8) &0x000000ff; header[20] = (width >> 16) &0x000000ff; header[21] = (width >> 24) &0x000000ff; long height = ysize; header[22] = height &0x000000ff; header[23] = (height >> 8) &0x000000ff; header[24] = (height >> 16) &0x000000ff; header[25] = (height >> 24) &0x000000ff; char fname_bmp[128]; sprintf(fname_bmp, "%s.bmp", filename); FILE *fp; if (!(fp = fopen(fname_bmp, "wb"))) return -1; fwrite(header, sizeof(unsigned char), 54, fp); fwrite(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp); fclose(fp); return 0;} void clonebmp(unsigned char * image, int xsize, int ysize) ... { bmp_read(image, xsize, ysize, "orgbmp"); //orgbmp为当前目录下的bmp文件名 bmp_write(image, xsize, ysize, "clone_bmp");//clone_bmp为克隆的bmp文件名} /**/ /***************************************************************************** 名称:youwritetobmp()* 功能:写入bmp文件* 入口参数:RGBQUAD *pixarr ---- 要写入的像素数组指针, int xsize ---- 图像宽度, int ysize ---- 图像高度, char *filename --图像名称* 出口参数:无* 返回值:-1:错误 ;0:正确****************************************************************************/ int youwritetobmp(RGBQUAD * pixarr, int xsize, int ysize, char * filename) ... { unsigned char header[54] = ...{ 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int i; int j; long file_size = (long)xsize * (long)ysize * 3 + 54; header[2] = (unsigned char)(file_size &0x000000ff); header[3] = (file_size >> 8) & 0x000000ff; header[4] = (file_size >> 16) & 0x000000ff; header[5] = (file_size >> 24) & 0x000000ff; long width; if(!(xsize%4)) width=xsize; else width= xsize+(4-xsize%4); //如不是4的倍数,则转换成4的倍数 header[18] = width & 0x000000ff; header[19] = (width >> 8) &0x000000ff; header[20] = (width >> 16) &0x000000ff; header[21] = (width >> 24) &0x000000ff; long height = ysize; header[22] = height &0x000000ff; header[23] = (height >> 8) &0x000000ff; header[24] = (height >> 16) &0x000000ff; header[25] = (height >> 24) &0x000000ff; char fname_bmp[128]; sprintf(fname_bmp, "%s.bmp", filename); FILE *fp; if (!(fp = fopen(fname_bmp, "wb"))) return -1; fwrite(header, sizeof(unsigned char), 54, fp); RGBQUAD zero=...{0,0,0}; //不足字节,用zero填充 for(j=0;j<ysize;j++)...{ if(!(xsize%4))...{ for(i=0;i<xsize;i++)...{ fwrite(pixarr+i, sizeof(RGBQUAD),1, fp); } } else ...{ for(i=0;i<xsize;i++)...{ fwrite(pixarr+i, sizeof(RGBQUAD),1, fp); } for(i=xsize;i<xsize+(4-xsize%4);i++)...{ fwrite(&zero, sizeof(RGBQUAD),1, fp); } } } fclose(fp); return 0;} int main() ... { unsigned char *image; int xsize = 320; int ysize = 163; RGBQUAD pixarray[PIXPLINE]; //一行像素值数组 image = (unsigned char *)malloc((size_t)xsize * ysize * 3); if (image == NULL) return -1; clonebmp(image,xsize,ysize); //功能一:实现一副图像的拷贝 youwritetobmp(pixarray,xsize,ysize,"yourimage");//功能二:实现像素的精确绘制,像素值在pixarray数组中 free(image); return -1;}