方法一:
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下打不开,不知道如何处理哪位大侠如果知道还请不吝赐教!