位图文件的打开和保存

        下面是两个函数, SaveBmp函数用于设备相关位图(DIB)保存为bmp格式的文件。DrawBitmapFile则用于将bmp格式的文件打开并显示在指定的设备环境上。

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

None.gif
None.gifBOOL DrawBitmapFile(HDC hdc, int left, int top, char *szFilename)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    
// 打开要映射的位图文件
InBlock.gif
    HANDLE   hFile = CreateFile( szFilename, GENERIC_READ, FILE_SHARE_READ,
InBlock.gif        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL ) ;
InBlock.gif    
if( hFile == INVALID_HANDLE_VALUE )
InBlock.gif        
return FALSE ;
InBlock.gif
InBlock.gif    
// 创建内存映象对象
InBlock.gif
    HANDLE   hMap = CreateFileMapping( hFile , NULL, PAGE_READONLY, NULL, NULL, NULL ) ;
InBlock.gif
InBlock.gif    
// 映射整个位图文件到内存,返回内存的首地址
InBlock.gif
    LPVOID   lpBase = MapViewOfFile( hMap , FILE_MAP_READ, 000 ) ;
InBlock.gif
InBlock.gif    
// 获取BMP文件信息
InBlock.gif
    BITMAPFILEHEADER     *pFileHeader ;
InBlock.gif    BITMAPINFO           
*pInfoHeader ;
InBlock.gif
InBlock.gif    
// 获取位图象素
InBlock.gif
    pFileHeader  =  (BITMAPFILEHEADER *) lpBase ;
InBlock.gif    
if( pFileHeader->bfType != MAKEWORD( 'B' , 'M' ) )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        UnmapViewOfFile( lpBase ) ;
InBlock.gif        CloseHandle( hMap ) ;
InBlock.gif        CloseHandle( hFile ) ;
InBlock.gif        
return FALSE ;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    BYTE 
*pBits = (BYTE *)lpBase + pFileHeader->bfOffBits ;
InBlock.gif
InBlock.gif    
// 获取文件大小
InBlock.gif
    pInfoHeader  =  (BITMAPINFO *)( (BYTE *)lpBase + sizeof(BITMAPFILEHEADER) ) ;
InBlock.gif    LONG  width  
=  pInfoHeader->bmiHeader.biHeight ;
InBlock.gif    LONG  height 
=  pInfoHeader->bmiHeader.biWidth  ;
InBlock.gif
InBlock.gif    
// 显示位图文件至hdc指定的设备
InBlock.gif
    HDC        hMemDC   = CreateCompatibleDC( hdc ) ;
InBlock.gif    HBITMAP    hBitmap  
= CreateCompatibleBitmap( hdc, width, height ) ;
InBlock.gif    SelectObject( hMemDC, hBitmap ) ;
InBlock.gif
InBlock.gif    
// 把图象数据放到建立的内存设备中
InBlock.gif
    int nRet = SetDIBitsToDevice( hMemDC, 00, width, height, 
InBlock.gif        
000, height , pBits, pInfoHeader, DIB_RGB_COLORS ) ;
InBlock.gif
InBlock.gif    
// 绘制图象到hdc中
InBlock.gif
    BitBlt( hdc, left, top, width, height, hMemDC , 0 , 0, SRCCOPY ) ;
InBlock.gif
InBlock.gif    DeleteObject( hBitmap ) ;
InBlock.gif    UnmapViewOfFile( lpBase ) ;
InBlock.gif    DeleteDC ( hMemDC ) ;
InBlock.gif    CloseHandle( hMap ) ;
InBlock.gif    CloseHandle( hFile ) ;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif

转载于:https://www.cnblogs.com/mywolrd/archive/2008/05/24/1930727.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值