从内存创建cbitmap

  1. BOOL CCdfkDlg::Load(LPCTSTR lpszPathName)  
  2. {  
  3.     BOOL bSuccess=FALSE;  
  4.     CFile file;  
  5.     //打开文件   
  6.     if(!file.Open(lpszPathName,CFile::modeRead))  
  7.     {  
  8.         TRACE(_T("Failed to open file %s,Error %x"),lpszPathName,::GetLastError());  
  9.         return FALSE;  
  10.     }  
  11.     //获取文件大小   
  12.     DWORD dwFileSize=file.GetLength();  
  13.     //以文件大小为基础分配内存   
  14.     LPVOID pvData=NULL;  
  15.     HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);  
  16.     if(hGlobal==NULL)  
  17.     {  
  18.         TRACE(_T("Failed to allocate memory for file %s,Error %x"),lpszPathName,::GetLastError());  
  19.         return FALSE;  
  20.     }  
  21.     pvData=GlobalLock(hGlobal);  
  22.     if(pvData==NULL)  
  23.     {  
  24.         TRACE(_T("Failed to lock memory"));  
  25.         GlobalFree(hGlobal);  
  26.         return FALSE;  
  27.     }  
  28.     //读取文件,存储到全局内存   
  29.     if(file.Read(pvData,dwFileSize)!=dwFileSize)  
  30.     {  
  31.         TRACE(_T("Failed to read image data from %s,Error:%x"),lpszPathName,::GetLastError());  
  32.         GlobalUnlock(hGlobal);  
  33.         GlobalFree(hGlobal);  
  34.         return FALSE;  
  35.     }  
  36.     //整理内存,关闭文件句柄   
  37.     GlobalUnlock(hGlobal);  
  38.     //在全局内存中创建IStream*   
  39.     LPSTREAM pStream=NULL;  
  40.     if(FAILED(CreateStreamOnHGlobal(hGlobal,TRUE,&pStream)))  
  41.     {  
  42.         TRACE(_T("Failed to create IStream interface from %s,Error %x"),lpszPathName,::GetLastError());  
  43.         GlobalFree(hGlobal);  
  44.         return FALSE;  
  45.     }  
  46.     //从图片文件上创建IPicture   
  47.     if (SUCCEEDED(::OleLoadPicture(pStream,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&pPic)))  
  48.     {  
  49.         short nType=PICTYPE_UNINITIALIZED;  
  50.         if(SUCCEEDED(pPic->get_Type(&nType))&&(nType==PICTYPE_BITMAP))  
  51.         {  
  52.             OLE_HANDLE hBitmap;  
  53.             OLE_HANDLE hPalette;  
  54.             if(SUCCEEDED(pPic->get_Handle(&hBitmap))&&SUCCEEDED(pPic->get_hPal(&hPalette)))  
  55.             {  
  56.                 m_Bitmap.Attach((HWND)hBitmap);  
  57.                 m_Palette.Attach((HPALETTE)hPalette);  
  58.                 bSuccess=TRUE;  
  59.             }  
  60.         }  
  61.     }  
  62.     file.Close();  
  63.     pStream->Release();  
  64.     GlobalFree(hGlobal);  
  65.     return bSuccess;  
  66. }  
这是一个用于C++ MFC开发的Bitmap图片操作类,在文件中叫CBitmapEx,可用于放大,缩小,翻转,过渡和其他有用的功能,有兴趣的朋友可以下载看看。 部分public method: // // void Create(long width, long height); // void Create(CBitmapEx& bitmapEx); // void Load(LPTSTR lpszBitmapFile); // void Save(LPTSTR lpszBitmapFile); // void Scale(long horizontalPercent=100, long verticalPercent=100); // void Rotate(long degrees=0, _PIXEL bgColor=_RGB(0,0,0)); // void FlipHorizontal(); // void FlipVertical(); // void MirrorLeft(); // void MirrorRight(); // void MirrorTop(); // void MirrorBottom(); // void Clear(_PIXEL clearColor=_RGB(0,0,0)); // void Negative(); // void Grayscale(); // void Sepia(long depth=34); // void Emboss(); // void Engrave(); // void Pixelize(long size=4); // void Draw(HDC hDC); // void Draw(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY); // void Draw(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, long alpha); // void Draw(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight); // void Draw(long dstX, long dstY, long dstWidth, long dstHeight, CBitmapEx& bitmapEx, // long srcX, long srcY, long srcWidth, long srcHeight, long alpha); // void DrawTransparent(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long width, long height, // CBitmapEx& bitmapEx, long srcX, long srcY, long alpha, // _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight, // _PIXEL transparentColor=_RGB(0,0,0)); // void DrawTransparent(long dstX, long dstY, long dstWidth, long dstHeight, // CBitmapEx& bitmapEx, long srcX, long srcY, long srcWidth, long srcHeight, // long alpha, _PIXEL transparentColor=_RGB(0,0,0)); // LPBI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值