图像数组保存为BMP文件解决方案
图像数组保存为BMP文件
手里有一个BYTE图像数组,长度,宽度,位数。请问如何转化为一个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;