可跨平台的写BMP文件方法(linux 和windows)

本文介绍了两种在程序中保存BMP图像的方法。方法一通过直接写入位图文件头和图像数据实现;方法二使用了BITMAPINFOHEADER和BITMAPFILEHEADER结构体来保存24位位图,并注意到了Linux环境下文件大小字段可能引起的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:

      

void SaveImage(char *file,unsigned char* bmp,int w ,int h,int position)
{
	int i = 0;
	char color = 0;
	char end[2] = {0,0};
	char patte[1024] = {0};
	int pos = 0;

	unsigned char heard[54] = {0x42,0x4d,0x30,0x0C,0x01,0,0,0,0,0,0x36,4,0,0,0x28,0,0,0,0xF5,0,0,0,0x46,0,0,0,0x01,0,8,0,0,0,0,0,0xF8,0x0b,0x01,0,0x12,0x0b,0,0,0x12,0x0b,0,0,0,0,0,0,0,0,0,0};
	int size = w*h;
	int allsize = size +1080;

	heard[2] = allsize&0xFF;
	heard[3] = (allsize>>8)&0xFF;
	heard[4] = (allsize>>16)&0xFF;
	heard[5] = (allsize>>24)&0xFF;

	heard[18] = w&0xFF;
	heard[19] = (w>>8)&0xFF;
	heard[20] = (w>>16)&0xFF;
	heard[21] = (w>>24)&0xFF;

	heard[22] = h&0xFF;
	heard[23] = (h>>8)&0xFF;
	heard[24] = (h>>16)&0xFF;
	heard[25] = (h>>24)&0xFF;

	allsize -=1078;
	heard[34] = allsize&0xFF;
	heard[35] = (allsize>>8)&0xFF;
	heard[36] = (allsize>>16)&0xFF;
	heard[37] = (allsize>>24)&0xFF;

	for(i=0;i<1024;i+=4)
	{
		patte[pos++] = color;
		patte[pos++] = color;
		patte[pos++] = color;
		patte[pos++] = 0;
		color++;
	}

	FILE* fd = NULL;

	fd = fopen(file,"wb+");
	if(fd == NULL)
	{
		return;
	}
	else
	{
		fwrite(heard,54,1,fd);
		fwrite(patte,1024,1,fd);
		fwrite(bmp,size,1,fd);
		fwrite(end,2,1,fd);
	}
	fclose(fd);
}

方法二:

    

bool SaveRAWImage(unsigned char*buf,long len,long w,long h,char*imagefile)  
{  
	int nLen;
	unsigned char *pMem;
	BITMAPINFOHEADER *bmhInfo;
	BITMAPFILEHEADER bmhfile;
	FILE* fd = NULL;

	fd = fopen(imagefile,"wb+");
	if(fd == NULL)
	{
		sprintf(chTempBuffer,"fopen failed : %s, %d,%s\n", __FILE__, __LINE__,strerror(errno)); 
		string sInfo = chTempBuffer;
		LogString(sInfo);
		return -1;
	}		

	nLen = len*3;//24位位图每个像素占3个字节
	cout<<"nLen "<<nLen<<endl;
	long memlen = nLen + sizeof(BITMAPINFOHEADER);
	long fileheaderlen= sizeof(BITMAPFILEHEADER);

	pMem=new unsigned char[memlen];
	bmhInfo=(BITMAPINFOHEADER *)pMem;
	bmhInfo->biSize=sizeof(BITMAPINFOHEADER);
	bmhInfo->biWidth=w;
	bmhInfo->biHeight=h;
	bmhInfo->biPlanes=1;
	bmhInfo->biBitCount=8*3;
	bmhInfo->biCompression=0;//BI_RGB
	bmhInfo->biSizeImage=0;
	bmhInfo->biXPelsPerMeter=0;
	bmhInfo->biYPelsPerMeter=0;
	bmhInfo->biClrUsed=0;
	bmhInfo->biClrImportant=0;

	bmhfile.bfType=0x4D42;//'B'+'M'*256;
	bmhfile.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nLen;
	bmhfile.bfReserved1=0;
	bmhfile.bfReserved2=0;
	bmhfile.bfOffBits=54;

	int p=0;
	for(long  i=0;i<len;i++)
	{
		pMem[sizeof(BITMAPINFOHEADER)+p] = buf[len-i-1];
		pMem[sizeof(BITMAPINFOHEADER)+p+1] = buf[len-i-1];
		pMem[sizeof(BITMAPINFOHEADER)+p+2] = buf[len-i-1];

		p +=3;
	}

	fwrite(&bmhfile,fileheaderlen,1,fd);
	fwrite(pMem,memlen,1,fd);

	fclose(fd);

	delete []pMem;
	pMem = NULL;


	return true;  
}
         但这种在Linux下会有问题可能是内存对齐的原因导致sizeof(BITMAPFILEHEADER)的值为16结果保存的bmp文件在Windows下打不开,不知道如何处理哪位大侠如果知道还请不吝赐教!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值