//保存位图文件 bool Write2Bitmap(BYTE *pData,CString filename,int width,int height,int bitcount) {
FILE *fe; int i; int index = 0; unsigned char rgbquad[4]; BITMAPFILEHEADER bitmapFileHeader; BITMAPINFOHEADER bitmapInfoHeader; int widthbytes = (int)((width*bitcount+31)/32)*4;
switch(bitcount) { case 1: index = 2; bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*4); break; case 4: index = 16; bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 16*4); break; case 8: index = 256; bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)); break; case 24: case 32: index = 0; bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); break; default: return FALSE; break; } bitmapFileHeader.bfType = 0x4d42; bitmapFileHeader.bfReserved1 = 0; bitmapFileHeader.bfReserved2 = 0; bitmapFileHeader.bfSize = (DWORD)(bitmapFileHeader.bfOffBits + height * widthbytes);
// write BITMAPFILEHEADER fe = fopen(filename,"wb"); if(fwrite((void *)&bitmapFileHeader,1,sizeof(BITMAPFILEHEADER),fe) != sizeof(BITMAPFILEHEADER)) { fclose(fe); //MessageBox("写文件头"); return FALSE; }
// write BITMAPINFOHEADER bitmapInfoHeader.biBitCount = bitcount; bitmapInfoHeader.biClrImportant = 0; bitmapInfoHeader.biClrUsed = 0; bitmapInfoHeader.biCompression = BI_RGB; bitmapInfoHeader.biHeight = height; bitmapInfoHeader.biWidth = width; bitmapInfoHeader.biPlanes = 1; bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapInfoHeader.biSizeImage = height * widthbytes; bitmapInfoHeader.biXPelsPerMeter = 0; bitmapInfoHeader.biYPelsPerMeter = 0;
if(fwrite((void *)&bitmapInfoHeader,1,sizeof(BITMAPINFOHEADER),fe) != sizeof(BITMAPINFOHEADER)) { fclose(fe); return FALSE; }
// write RGBQUAD if(bitcount == 8) { rgbquad[3] = 0; for(i = 0; i < index; i++) { rgbquad[0] = rgbquad[1] = rgbquad[2] = i; if(fwrite((void*)rgbquad, 1, sizeof(RGBQUAD), fe) != sizeof(RGBQUAD)) { fclose(fe); return FALSE; } } }
if(bitcount == 1) { rgbquad[3] = 0; for(i = 0; i < index; i++) { rgbquad[0] = rgbquad[1] = rgbquad[2] = (256 - i)%256; if(fwrite((void*)rgbquad, 1, sizeof(RGBQUAD), fe) != sizeof(RGBQUAD)) { fclose(fe); return FALSE; } } } // write ImageData if(fwrite((void *)pData,1,height * widthbytes,fe) != height * widthbytes) { fclose(fe); return FALSE; } fclose(fe); return TRUE; }