图像数组保存为BMP文件解决方案

图像数组保存为BMP文件
手里有一个BYTE图像数组,长度,宽度,位数。请问如何转化为一个BMP文件。

下面是我的代码,我在转出保存的时候,出来的图片全是黑的?
	//图片载入
    HBITMAP m_hBitmap;//位图句柄
BITMAP bm;//存放位图信息的结构
CBitmap m_bitmap;

char temptest[1024];memset(temptest,0x00,sizeof(temptest));

   m_hBitmap = (HBITMAP)::LoadImage(NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   //装载位图    
   if(m_bitmap.m_hObject)
   m_bitmap.DeleteObject();  
   m_bitmap.Attach(m_hBitmap);//将句柄与CBitmap关联起来    
   m_bitmap.GetBitmap(&bm);    
   
   int height = bm.bmHeight;//图像的宽高
   memset(temptest,0x00,sizeof(temptest));sprintf(temptest,"%d",height);AfxMessageBox(temptest);
   int width = bm.bmWidth;
   memset(temptest,0x00,sizeof(temptest));sprintf(temptest,"%d",width);AfxMessageBox(temptest);
   int widthBytes=bm.bmWidthBytes;//图像一行数据所占的字节数
   memset(temptest,0x00,sizeof(temptest));sprintf(temptest,"%d",widthBytes);AfxMessageBox(temptest);
//////////////////////////////////////////////////////////////////////////
   //获取图像数组

   int size=height*widthBytes;//大小 
   BYTE *lpBits=new BYTE[size];
   m_bitmap.GetBitmapBits(size,lpBits);//得到RGB数据
   
   BYTE *lpGray=new BYTE[height*width];
   
   int R, G, B;
   
   for(int i=0;i<height;i++)
   
   for(int j=0;j<width;j++)
   {
   
   B=lpBits[i*widthBytes+j*4];
   
   G=lpBits[i*widthBytes+j*4+1];
   
   R=lpBits[i*widthBytes+j*4+2];
   
   lpGray[i*width+j]=(B+G+R)/3;//转化为灰度
   
}   

//////////////////////////////////////////////////////////////////////////
//生成一张测试图片

   //图片载入
   HBITMAP m_hBitmap1;//位图句柄
   BITMAP bm1;//存放位图信息的结构
   CBitmap m_bitmap1;
   
   
   m_hBitmap1 = (HBITMAP)::CreateBitmap(width,height,1,8,lpBits);   //装载位图    
   if(m_bitmap1.m_hObject)
   m_bitmap1.DeleteObject();  
   m_bitmap1.Attach(m_hBitmap1);//将句柄与CBitmap关联起来    
   m_bitmap1.GetBitmap(&bm1);    

SaveBitmapToFile(m_hBitmap1,"2.bmp");


delete []lpBits;

delete []lpGray;


保存函数
int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄
{      //lpFileName 为位图文件名
HDC     hDC;         
//设备描述表
int     iBits;      
//当前显示分辨率下每个像素所占字节数
WORD    wBitCount;   
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 ,  位图文件大小 , 写入文件字节数
DWORD           dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAP          Bitmap;        
//位图属性结构
BITMAPFILEHEADER   bmfHdr;        
//位图文件头结构
BITMAPINFOHEADER   bi;            
//位图信息头结构 
LPBITMAPINFOHEADER lpbi;          
//指向位图信息头结构
    HANDLE          fh, hDib, hPal;
HPALETTE     hOldPal=NULL;
//定义文件,分配内存句柄,调色板句柄

    //计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL)*GetDeviceCaps(hDC, PLANES);
    DeleteDC(hDC);
    if (iBits <= 1)
wBitCount = 1;
    else if (iBits <= 4)
wBitCount = 4;
    else if (iBits <= 8)
wBitCount = 8;
    else if (iBits <= 32)
wBitCount = 24;
    //计算调色板大小
if (wBitCount <= 8)
dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);
    
    //设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
    bi.biSize            = sizeof(BITMAPINFOHEADER);
    bi.biWidth           = Bitmap.bmWidth;
    bi.biHeight          = Bitmap.bmHeight;