zoukankan      html  css  js  c++  java
  • VC下把HBITMAP保存为bmp图片

    //VC下把HBITMAP保存为bmp图片 
    BOOL  SaveBmp(HBITMAP     hBitmap,   CString     FileName)       
    {       
    	HDC     hDC;       
    	//当前分辨率下每象素所占字节数       
    	int     iBits;       
    	//位图中每象素所占字节数       
    	WORD     wBitCount;       
    	//定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数           
    	DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;           
    	//位图属性结构           
    	BITMAP     Bitmap;               
    	//位图文件头结构       
    	BITMAPFILEHEADER     bmfHdr;               
    	//位图信息头结构           
    	BITMAPINFOHEADER     bi;               
    	//指向位图信息头结构               
    	LPBITMAPINFOHEADER     lpbi;               
    	//定义文件,分配内存句柄,调色板句柄           
    	HANDLE     fh,   hDib,   hPal,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                                                                                                                             
    		wBitCount  = 24;           
    
    	GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);       
    	bi.biSize= sizeof(BITMAPINFOHEADER);       
    	bi.biWidth = Bitmap.bmWidth;       
    	bi.biHeight =  Bitmap.bmHeight;       
    	bi.biPlanes =  1;       
    	bi.biBitCount = wBitCount;       
    	bi.biCompression= BI_RGB;       
    	bi.biSizeImage=0;       
    	bi.biXPelsPerMeter = 0;       
    	bi.biYPelsPerMeter = 0;       
    	bi.biClrImportant = 0;       
    	bi.biClrUsed =  0;       
    
    	dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;       
    
    	//为位图内容分配内存           
    	hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));           
    	lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);           
    	*lpbi  = bi;           
    
    	//     处理调色板               
    	hPal  = GetStockObject(DEFAULT_PALETTE);           
    	if (hPal)           
    	{           
    		hDC  = ::GetDC(NULL);           
    		hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);           
    		RealizePalette(hDC);           
    	}       
    
    	//     获取该调色板下新的像素值           
    	GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,
    		(LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize, 
    		(BITMAPINFO *)lpbi, DIB_RGB_COLORS);           
    
    	//恢复调色板               
    	if (hOldPal)           
    	{           
    		::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);           
    		RealizePalette(hDC);           
    		::ReleaseDC(NULL,   hDC);           
    	}           
    
    	//创建位图文件               
    	fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,         
    		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);           
    
    	if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;           
    
    	//     设置位图文件头           
    	bmfHdr.bfType  = 0x4D42;     //     "BM"           
    	dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;               
    	bmfHdr.bfSize  = dwDIBSize;           
    	bmfHdr.bfReserved1  = 0;           
    	bmfHdr.bfReserved2  = 0;           
    	bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;           
    	//     写入位图文件头           
    	WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);           
    	//     写入位图文件其余内容           
    	WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);           
    	//清除               
    	GlobalUnlock(hDib);           
    	GlobalFree(hDib);           
    	CloseHandle(fh);           
    
    	return     TRUE;       
    }
    


  • 相关阅读:
    python中常见的部分错误
    不同类型指针自加所移动位置分析
    c语言,sizeof关键字,数组和指针区别
    数组名和指针能够等价的情况
    typedef与define宏定义用于声明新的类型之间的区别
    老问题了,函数返回指向常字符串的指针,形如 char *func()
    c语言运算符优先级 ., *, (), []
    const char**与char**类型的区别
    char *f[]与char (*f)[]的区别
    标准IO库函数sprintf
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318769.html
Copyright © 2011-2022 走看看