高分求24位图截取,就是要在原始24位图上截取一个矩形位图并保存,请大家赐教啊 !不胜感激,高分相赠!!

解决方案 »

  1.   

    这是网上找到一个大哥的代码,只能截取8位位图,那个大哥牛人给改成24位图的照样给分,函数入口参数就是原始位图的 HDIB和截取矩形,出口就是截取位图的 HDIB。。谢谢大家了!!//   Only   support   8   bit   image.   
        
      HDIB   CropDib   (HDIB   hdib,   LPRECT   prc)   
      {   
      HDIB     hDst,h;   
      BYTE   *lpDst;   
      BYTE   *lpSrc;   
      LPBITMAPINFOHEADER   lpbiDst,lpbiSrc;   
      DWORD   dx,dy,width,height;   
      DWORD   dwSrcLineLen,   dwDstLineLen;   
      DWORD   dwLen,dwBytes;   
      register   int   y;   
        
      dx   =   (DWORD)prc->right   -   prc->left;   
      dy   =   (DWORD)prc->bottom   -   prc->top;   
        
      hDst   =   (HDIB)CopyHandle(hdib);           
        
      lpSrc   =   (BYTE   *)GlobalLock(hdib);   
      lpbiSrc   =   (LPBITMAPINFOHEADER)lpSrc;   
        
      width   =   lpbiSrc->biWidth;   
      height   =   lpbiSrc->biHeight;   
      dwSrcLineLen   =   ALIGNULONG(   (DWORD)width   );   
                                                                
      dwBytes   =   ALIGNULONG(dx)   *   dy;   
      dwLen     =   lpbiSrc->biSize   +   (DWORD)PaletteSize((LPSTR)lpbiSrc)   +   dwBytes;   
                
              h   =(HDIB)   GlobalReAlloc(hDst,   dwLen,   GHND);   
              if   (!h){   
                      GlobalUnlock(hdib);   
                      return   NULL;   
              }   
              else   
                      hDst   =   h;   
        
      lpDst   =   (BYTE   *)GlobalLock(hDst);   
      lpbiDst   =   (LPBITMAPINFOHEADER)lpDst;   
        
      lpbiDst->biWidth   =   dx;   
      lpbiDst->biHeight   =   dy;   
              lpbiDst->biSizeImage   =   dwBytes;   
        
      dwDstLineLen   =   ALIGNULONG(   (DWORD)dx   );   
        
      lpDst   =   lpDst   +   lpbiDst->biSize   +   PaletteSize((LPSTR)lpDst);   
      lpSrc   =   lpSrc   +   lpbiSrc->biSize   +   PaletteSize((LPSTR)lpSrc);   
        
      lpSrc   =   lpSrc   +   dwSrcLineLen   *   (height   -   (DWORD)prc->bottom)   +   (DWORD)prc->left;   
        
      for(   y   =   0;   y   <   (int)dy;   y   ++   )           
      {   
      CopyMemory(   lpDst,lpSrc,   (size_t)dx   );   
      lpSrc   +=   dwSrcLineLen;   
      lpDst   +=   dwDstLineLen;   
      }   
        
                  
      GlobalUnlock(   hDst   );   
      GlobalUnlock(   hdib   );   
                  
              return   hDst;   
      }