打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
BMP图片读写函数

BMP读函数:

 #include <stdio.h> #include <fcntl.h>typedef unsigned short U16;typedef unsigned long  U32;#pragma pack(1) //设置1字节对齐模式,pack()将对齐模式取消/*位图文件头*/typedef struct BMP_FILE_HEADER{	U16 bType;             /*  文件标识符          */	U32 bfSize;            /*  文件的大小,单位字节 */	U16 bReserved1;        /*  保留值,必须设置为0  */	U16 bReserved2;        /*  保留值,必须设置为0  */	U32 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;#pragma pack()/*彩色表*/typedef struct RGB_QUAD{	U16 rgbBlue;         /*  蓝色强度  */	U16 rgbGreen;        /*  绿色强度  */	U16 rgbRed;          /*  红色强度  */	U16 rgbReversed;     /*  保留值    */} RGBQUAD;int read_bmp(const char *path, char *img_src_r, char * img_src_g, char * img_src_b, int *width, int *height){	FILE* fp;	BMPFILEHEADER fileHeader = { 0 };	BMPINF infoHeader = { 0 };	long offset, bmpImageSize, bytesPerPixel, size, bitCount;	int i = 0, j = 0, count = 0;	int lcount = 0;	int cl[3] = { 0 };	U16 c;	char *bmpData;	int lineByte = 0;	fp = fopen(path, "rb");	if (fp == NULL) {		return -1;	}	fread(&fileHeader, sizeof(BMPFILEHEADER), 1, fp);	fread(&infoHeader, sizeof(BMPINF), 1, fp);	//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)  	lineByte = (infoHeader.bWidth * infoHeader.bBitCount / 8   3) / 4 * 4;	bmpData = (char *)malloc((infoHeader.bHeight*infoHeader.bWidth * 3) * sizeof(char));	fseek(fp, fileHeader.bOffset, SEEK_SET);	fread(bmpData, 1, infoHeader.bHeight*infoHeader.bWidth * 3, fp);	for (i = 0; i < infoHeader.bHeight;   i) {		for (j = 0; j < infoHeader.bWidth;   j) {			img_src_b[i*infoHeader.bWidth   j] = bmpData[i*infoHeader.bWidth * 3   j * 3];			img_src_g[i*infoHeader.bWidth   j] = bmpData[i*infoHeader.bWidth * 3   j * 3   1];			img_src_r[i*infoHeader.bWidth   j] = bmpData[i*infoHeader.bWidth * 3   j * 3   2];		}	}	free(bmpData);	fclose(fp);	return 0;}

写函数

void saveBmp(char * filename, unsigned char * imageData, int height, int width, int channels){bmpFileHead bh;bmpHeadInfo bi;RGBQUAD rq[256];FILE * fout = fopen(filename, "wb");unsigned short fileType = 0x4D42;fwrite(&fileType, sizeof(unsigned short), 1, fout);int step = channels * width;int offset = step % 4;if (offset != 0)	step  = (4 - offset);if (channels == 1)	bh.bfSize = height * step   1078;else	bh.bfSize = height * step   54;bh.bfReserved1 = 0;bh.bfReserved2 = 0;if (channels == 1)	bh.bfOffBits = 1078;else	bh.bfOffBits = 54;fwrite(&bh, sizeof(bmpFileHead), 1, fout);//  printf("%d\n", (int)bh.bfType);//  printf("%ld\n", bh.bfSize);//  printf("%d\n", (int)bh.bfReserved1);//  printf("%d\n", (int)bh.bfReserved2);//  printf("%ld\n", bh.bfOffBits);int r;for (r = 0; r < 256; r  ){	rq[r].rgbBlue = rq[r].rgbGreen = rq[r].rgbRed = r;	rq[r].rgbReserved = 0;	//  printf("%d\n", rq[r].rgbBlue);	//  printf("%d\n", rq[r].rgbGreen);	//  printf("%d\n", rq[r].rgbRed);	//  printf("%d\n", rq[r].rgbReserved);}bi.biSize = 40;bi.biWidth = width;//bi.biHeight =-height;bi.biHeight = height; //hujianhuabi.biPlanes = 1;bi.biBitCount = 8 * channels;bi.biCompression = 0;bi.biSizeImage = height*step;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;//  printf("%ld\n", bi.biSize);//  printf("%ld\n", bi.biWidth);//  printf("%ld\n", bi.biHeight);//  printf("%d\n", bi.biPlanes);//  printf("%d\n", bi.biBitCount);//  printf("%ld\n", bi.biCompression);//  printf("%ld\n", bi.biSizeImage);//  printf("%ld\n", bi.biXPelsPerMeter);//  printf("%ld\n", bi.biYPelsPerMeter);//  printf("%ld\n", bi.biClrUsed);//  printf("%ld\n", bi.biClrImportant);fwrite(&bi, sizeof(bmpHeadInfo), 1, fout);if (channels == 1)	fwrite(&rq, 4, 256, fout);//unsigned char dc[channels];unsigned char def = 0;//  fseek(fout, 1078, SEEK_SET);int i, j, c;for (i = height - 1; i >= 0; i--){	for (j = 0; j < width; j  )	{		for (c = 0; c < channels; c  )		{			int value = imageData[(i * width   j) * channels   c];			//  if(value > 255)			//      printf("%d\t", value);			fwrite(&imageData[(i * width   j) * channels   c], sizeof(unsigned char), 1, fout);		}	}	if (offset != 0)	{		for (j = 0; j < 4 - offset; j  )		{			fwrite(&def, sizeof(unsigned char), 1, fout);		}	}}fclose(fout);

}

来源:http://www.icode9.com/content-4-144351.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c
Linux下利用libjpeg实现bmp与jpg相互转换C代码
Java读取BMP格式图片(源代码,转)
OpenGL图像保存为bmp文件
BMP、GIF和JPEG文件格式简介及相互转换
Linux块设备驱动详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服