• 1432阅读
  • 4回复

20.VC(ui)-图片处理的一些函数 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-19




自己经常写的,写多了就慢慢总结下来,方便://---------------------------------------------------
// 函数介绍:把资源写入lpImage,支持BMP,PNG,JPG.
// 输入参数:
// 输出参数:
// 返回值:
//---------------------------------------------------
[cpp] view plain copy
  1. BOOL CImageManager::LoadResImage(UINT nResID,  
  2.                                  LPCTSTR lpType,  
  3.                                  Bitmap *&lpImage,  
  4.                                  HINSTANCE hInstance)  
  5. {  
  6.     lpImage  = NULL;  
  7.   
  8.     hInstance = (NULL == hInstance) ? ::AfxGetResourceHandle() : hInstance;  
  9.     // If bmp,use system load.  
  10.     if (RT_BITMAP == lpType)  
  11.     {  
  12.         HBITMAP hBmp = ::LoadBitmap(hInstance, MAKEINTRESOURCE(nResID));  
  13.         lpImage = Bitmap::FromHBITMAP(hBmp, 0);  
  14.         ::DeleteObject(hBmp);  
  15.   
  16.         if (!lpImage)  
  17.         {  
  18.             TRACE("lpImage is NULL\n");  
  19.             return FALSE;  
  20.         }  
  21.         else  
  22.         {  
  23.             if (Gdiplus::Ok != lpImage->GetLastStatus())  
  24.             {  
  25.                 TRACE("lpImage is error\n");  
  26.                 return FALSE;  
  27.             }  
  28.             else  
  29.             {  
  30.                 return TRUE;  
  31.             }  
  32.         }  
  33.     }  
  34.   
  35.     // User-Defined  
  36.   
  37.     HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nResID), lpType);  
  38.     if (!hRsrc)  
  39.     {  
  40.         TRACE("hRscs is NULL\n");  
  41.         return FALSE;  
  42.     }  
  43.   
  44.     // Load resource into memory ---------------------------------  
  45.     DWORD len = ::SizeofResource(hInstance, hRsrc);  
  46.   
  47.     BYTE *lpRsrc = (BYTE*)::LoadResource(hInstance, hRsrc);  
  48.     if (!lpRsrc)  
  49.     {  
  50.         TRACE("lpRsrc is NULL\n");  
  51.         return FALSE;  
  52.     }  
  53.   
  54.     // Allocate global memory on which to create stream ----------  
  55.     HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, len);  
  56.   
  57.     BYTE *pMem = (BYTE*)::GlobalLock(hMem);  
  58.     memcpy(pMem, lpRsrc, len);  
  59.   
  60.     IStream *pStream = NULL;  
  61.     // You can query MSDN,why I use TRUE, -- hgy notes.  
  62.     HRESULT ht = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);  
  63.     if (S_OK != ht)  
  64.     {  
  65.         TRACE("ht is error\n");  
  66.         return FALSE;  
  67.     }  
  68.   
  69.     // Load from stream -------------------------------------------  
  70.     lpImage = Gdiplus::Bitmap::FromStream(pStream);  
  71.   
  72.     // free/release stuff -----------------------------------------  
  73.     ::GlobalUnlock(hMem);  
  74.     pStream->Release();  
  75.     ::FreeResource(lpRsrc);  
  76.   
  77.     if (!lpImage)  
  78.     {  
  79.         TRACE("lpImage is NULL\n");  
  80.         return FALSE;  
  81.     }  
  82.     else  
  83.     {  
  84.         if (Gdiplus::Ok != lpImage->GetLastStatus())  
  85.         {  
  86.             TRACE("lpImage is error\n");  
  87.             return FALSE;  
  88.         }  
  89.         else  
  90.         {  
  91.             return TRUE;  
  92.         }  
  93.     }  
  94. }  
//---------------------------------------------------
// 函数介绍:抓取当前窗口的图片
// 输入参数: 传NULL抓的是这个窗口下面的屏幕背景.(如果是透明的,就是透明的背景)
// 输出参数:
// 返回值:
//---------------------------------------------------
[cpp] view plain copy
  1. HBITMAP CImageManager::GetWindowBitmap(HWND hWnd, LPRECT lpRect)  
  2. {  
  3.     if (!lpRect)  
  4.     {  
  5.         return NULL;  
  6.     }  
  7.   
  8.     HDC hDC = NULL;  
  9.   
  10.     if (NULL == hWnd)  
  11.     {  
  12.         hDC = ::GetDC(HWND_DESKTOP);  
  13.     }  
  14.     else  
  15.     {  
  16.         hDC = ::GetWindowDC(hWnd);  
  17.     }  
  18.   
  19.     if (NULL == hDC)  
  20.     {  
  21.         return NULL;  
  22.     }  
  23.   
  24.     HDC hMemDC = ::CreateCompatibleDC(hDC);  
  25.     HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, lpRect->right-lpRect->left,  
  26.         lpRect->bottom-lpRect->top);  
  27.   
  28.     if (NULL == hBitmap)  
  29.     {  
  30.         return NULL;  
  31.     }  
  32.   
  33.     HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);  
  34.     ::BitBlt(hMemDC, 0, 0, lpRect->right-lpRect->left,  
  35.         lpRect->bottom-lpRect->top, hDC, lpRect->left,  
  36.         lpRect->top, SRCCOPY);  
  37.   
  38.     ::SelectObject(hMemDC, hOldBitmap);  
  39.     ::DeleteDC(hMemDC);  
  40.     ::ReleaseDC(hWnd, hDC);  
  41.   
  42.     return hBitmap;  
  43. }  

//---------------------------------------------------
// 函数介绍:把HBITMAP保存成文件
// 输入参数:
// 输出参数:
// 返回值:
//---------------------------------------------------
[cpp] view plain copy
  1. BOOL CImageManager::SaveBitmapToFile(HBITMAP hBitmap,  
  2.                                      CString FileName)  
  3. {  
  4.     if (hBitmap==NULL  
  5.         || FileName.IsEmpty())  
  6.     {  
  7.         return false;  
  8.     }  
  9.     // -----------------------------------------------------  
  10.     //DIB文件有四个主要部分:  
  11.     //  文件表头        
  12.     //  信息表头        
  13.     //  RGB色彩对照表(不一定有)    
  14.     //  位图图素位  
  15.     //Windows中DIB的扩展版本:  
  16.     // 以BITMAPFILEHEADER结构开始,接着是BITMAPINFOHEADER结构  
  17.     //  
  18.     // -----------------------------------------------------  
  19.   
  20.     //指向位图信息头结构    
  21.     LPBITMAPINFOHEADER lpbi;    
  22.     //定义文件,分配内存句柄,调色板句柄   
  23.     HANDLE fh, hDib, hPal,hOldPal=NULL;  
  24.   
  25.     //计算位图文件每个像素所占字节数   
  26.     HDC hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);  
  27.     //当前分辨率下每象素所占字节数  
  28.     int iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);  
  29.     DeleteDC(hDC);  
  30.   
  31.     WORD wBitCount;  
  32.     if (iBits <= 1)  
  33.     {  
  34.         wBitCount = 1;  
  35.     }  
  36.     else if (iBits <= 4)    
  37.     {  
  38.         wBitCount = 4;  
  39.     }  
  40.     else if (iBits <= 8)  
  41.     {  
  42.         wBitCount = 8;  
  43.     }  
  44.     else    
  45.     {  
  46.         wBitCount = 24;  
  47.     }  
  48.   
  49.   
  50.     //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数   
  51.     DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;  
  52.   
  53.     //位图属性结构   
  54.     BITMAP Bitmap;    
  55.     ::GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);  
  56.   
  57.     //位图信息头结构   
  58.     /* --------------------------------------------------------------
  59.     struct tagBITMAPINFOHEADER{
  60.     DWORD      biSize;//40
  61.     LONG       biWidth;//BITMAP::bmWidth
  62.     LONG       biHeight;//BITMAP::bmHeight
  63.     WORD       biPlanes;//1
  64.     WORD       biBitCount;
  65.     DWORD      biCompression;
  66.     DWORD      biSizeImage;
  67.     LONG       biXPelsPerMeter;
  68.     LONG       biYPelsPerMeter;
  69.     DWORD      biClrUsed;
  70.     DWORD      biClrImportant;
  71.     } BITMAPINFOHEADER
  72.     ----------------------------------------------------------------*/  
  73.     BITMAPINFOHEADER bi;    
  74.     bi.biSize          = sizeof(BITMAPINFOHEADER);  
  75.     bi.biWidth         = Bitmap.bmWidth;  
  76.     bi.biHeight        = Bitmap.bmHeight;  
  77.     bi.biPlanes        = 1;//  
  78.     bi.biBitCount      = wBitCount;  
  79.     bi.biCompression   = BI_RGB;  
  80.     bi.biSizeImage     = 0;  
  81.     bi.biXPelsPerMeter = 0;  
  82.     bi.biYPelsPerMeter = 0;  
  83.     bi.biClrImportant  = 0;  
  84.     bi.biClrUsed       = 0;  
  85.   
  86.     // -------------------------------------------------------  
  87.     // 以字节为单位的每行长度始终是4的倍数。行的长度可以计算为:  
  88.     // RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32) ;  
  89.     // 或者在C内用更有效的方法:  
  90.     // RowLength = ((bmch.bcWidth * bmch.bcBitCount + 31) & ~31) >> 3 ;  
  91.     // -------------------------------------------------------  
  92.     //图素数据的总字节数等于RowLength和Bitmap.bmHeight的乘积。  
  93.     dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;  
  94.   
  95.     //为位图内容分配内存   
  96.     hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));  
  97.     lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);  
  98.     *lpbi = bi;  
  99.   
  100.     // 处理调色板    
  101.     hPal = GetStockObject(DEFAULT_PALETTE);  
  102.     if (hPal)  
  103.     {  
  104.         hDC = ::GetDC(NULL);  
  105.         hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);  
  106.         RealizePalette(hDC);  
  107.     }  
  108.   
  109.     // 获取该调色板下新的像素值   
  110.     GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)  
  111.         +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);  
  112.   
  113.     // 恢复调色板    
  114.     if (hOldPal)  
  115.     {  
  116.         ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);  
  117.         RealizePalette(hDC);  
  118.         ::ReleaseDC(NULL, hDC);  
  119.     }  
  120.   
  121.     // 创建位图文件    
  122.     fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,  
  123.         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
  124.   
  125.     if (fh == INVALID_HANDLE_VALUE)  return FALSE;  
  126.   
  127.     //位图文件头结构  
  128.     /* --------------------------------------------------------------
  129.     struct tagBITMAPFILEHEADER {
  130.        WORD    bfType;// "BM" 或 0x4D42
  131.         DWORD   bfSize;//整个文件的大小.
  132.         WORD    bfReserved1;//0
  133.         WORD    bfReserved2;//0
  134.         DWORD   bfOffBits;//指出了文件中图素位开始位置的字节偏移量,此数值来自DIB信息表头中的信息,为了使用的方便提供在这里
  135.         //这样,我们可以很快定位到图形数据的起始位.
  136.     } BITMAPFILEHEADER
  137.     --------------------------------------------------------------*/  
  138.     BITMAPFILEHEADER bmfHdr;    
  139.       
  140.     // 设置位图文件头   
  141.     bmfHdr.bfType = 0x4D42; // "BM"   
  142.     dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;    
  143.     bmfHdr.bfSize = dwDIBSize;  
  144.     bmfHdr.bfReserved1 = 0;  
  145.     bmfHdr.bfReserved2 = 0;  
  146.     bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;  
  147.     // 写入位图文件头   
  148.     WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);  
  149.     // 写入位图文件其余内容   
  150.     WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);  
  151.     //清除    
  152.     GlobalUnlock(hDib);  
  153.     GlobalFree(hDib);  
  154.     CloseHandle(fh);  
  155.   
  156.     return TRUE;  
  157.   
  158. }  

//---------------------------------------------------
// 函数介绍:改变HBITMAP中所有的A值
// 输入参数:
// 输出参数:
// 返回值:
//---------------------------------------------------
[cpp] view plain copy
  1. void CImageManager::ChangeHBitmapAlpha(HBITMAP hBitmap, int alpha)  
  2. {  
  3.     DWORD dwSize = ::GetBitmapBits(hBitmap, 0, NULL);  
  4.     char *lpBuffer = new char[dwSize];  
  5.     ::GetBitmapBits(hBitmap,dwSize,lpBuffer);  
  6.   
  7.     for(int i = 0; i+3<dwSize; i+=4)  
  8.     {  
  9.         lpBuffer[i+3] = alpha;  
  10.         //lpBuffer[i+0] = 0;//B  
  11.         //lpBuffer[i+1] = 0;//G  
  12.         //lpBuffer[i+2] = 0;//R  
  13.     }  
  14.   
  15.     ::SetBitmapBits(hBitmap,dwSize, lpBuffer);  
  16.     delete[] lpBuffer;  
  17. }  

顶0踩
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线im86165507

只看该作者 沙发  发表于: 2016-02-19
离线v2680267313

只看该作者 板凳  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线hamigua008

只看该作者 地板  发表于: 2017-01-17
学习学习
离线qq1156136807

只看该作者 4楼 发表于: 2017-12-29
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个