2: Write buffer to an BMP file

{
  int iHeight = 2560;
  int iWidth = 2480;
  int nRet = 0;
  

  CFile file;
  if(!file.Open(TEXT("c:\\tp_test.bmp"),CFile::modeCreate|CFile::modeWrite))
  {
   file.Close();
   return SPID_ERROR_FILE_CREATE;
  }

  BITMAPFILEHEADER bmpFileHdr;
  BITMAPINFOHEADER bmpInfoHdr;
  ::FillMemory(&bmpFileHdr,sizeof(BITMAPFILEHEADER),0);
  ::FillMemory(&bmpInfoHdr,sizeof(BITMAPINFOHEADER),0);

  bmpFileHdr.bfType = 19778;
  bmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
  bmpFileHdr.bfSize = iWidth * iHeight + bmpFileHdr.bfOffBits;

  bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
  bmpInfoHdr.biWidth = iWidth;
  bmpInfoHdr.biHeight = iHeight;
  bmpInfoHdr.biPlanes = 1;
  bmpInfoHdr.biBitCount = 8;
  bmpInfoHdr.biCompression = BI_RGB;
  bmpInfoHdr.biXPelsPerMeter = (LONG)(theApp.imgResolution * 10000 / 254);
  bmpInfoHdr.biYPelsPerMeter = (LONG)(theApp.imgResolution * 10000 / 254);
  bmpInfoHdr.biSizeImage = iWidth * iHeight;

  file.Write(&bmpFileHdr, sizeof(BITMAPFILEHEADER));//file header
  file.Write(&bmpInfoHdr, sizeof(BITMAPINFOHEADER));//bm info hdr

  //generate pallete
  BYTE pal[256*sizeof(RGBQUAD)];
  for (int i = 0; i < 256; i++)
  {
   pal[i*4+0] = pal[i*4+1] = pal[i*4+2] = i;
   pal[i*4+3] = 0;
  }

  file.Write(pal, 256*sizeof(RGBQUAD));//pallete

  // Write image
  //BYTE* ptr = (BYTE*)image.Buffer;
  for( int y = 0; y < iHeight; y++ )
  {
   file.Write( lpBits + (iHeight-1-y)*iWidth, iWidth );
  }

  file.Close();
 }

posted @ 2011-12-16 17:07  lcryby  阅读(241)  评论(0)    收藏  举报