图像拉伸,放大缩小算法函数

平滑放大缩小拉伸图像,本函数同时具有很高的效率。
其中BITMAP24结构和BITMAP 结构类似,在这里你可以假设两者相同。
pMapX,pMapY用于建立积卷映射表,同时将浮点运算转换成浮点运算。
  1. void ImageStretch(BITMAP24 & dest,const BITMAP24 & src)
  2. {
  3.     ASSERT(dest.bmWidth>0 && dest.bmHeight>0);
  4.     ASSERT(src.bmWidth>0 && src.bmHeight>0);
  5.     double fZoomX = (double)dest.bmWidth/(double)src.bmWidth;
  6.     double fZoomY = (double)dest.bmHeight/(double)src.bmHeight;
  7.     LONG        i;
  8.     POINTMAP *  pMapX;
  9.     POINTMAP *  pMapY;
  10.     double      fMin,fMax;
  11.     pMapX = CImageDataMgr::instance().AllocXPointMap(dest.bmWidth);
  12.     pMapY = CImageDataMgr::instance().AllocYPointMap(dest.bmHeight);
  13.     // 初始化pMapX
  14.     if (fZoomX<1.0f)
  15.     {
  16.         for (i=0;i<dest.bmWidth;i++)
  17.         {
  18.             fMin = i/fZoomX;
  19.             fMax = (i+1)/fZoomX;
  20.             pMapX[i].ps  = (int)fMin;
  21.             pMapX[i].pe  = (int)fMax;
  22.             if (pMapX[i].ps>=src.bmWidth) pMapX[i].ps=src.bmWidth-1;
  23.             if (pMapX[i].pe>=src.bmWidth) pMapX[i].pe=src.bmWidth-1;
  24.             pMapX[i].ws = (int)((pMapX[i].ps+1.0f-fMin)*fZoomX*256);
  25.             pMapX[i].we = (int)((fMax-pMapX[i].pe)*fZoomX*256);
  26.             pMapX[i].wi = 256-pMapX[i].ws-pMapX[i].we;
  27.         }
  28.     } else if (fZoomX==1.0f)
  29.     {
  30.         for (i=0;i<dest.bmWidth;i++)
  31.         {
  32.             pMapX[i].ps = i;
  33.             pMapX[i].pe = i;
  34.             pMapX[i].ws = 256;
  35.             pMapX[i].we = 0;
  36.         }
  37.     } else if (fZoomX>1.0f)
  38.     {
  39.         for (i=0;i<dest.bmWidth;i++)
  40.         {
  41.             fMin = i/fZoomX;
  42.             pMapX[i].ps = (LONG)fMin;
  43.             pMapX[i].pe = pMapX[i].ps+1;
  44.             if (pMapX[i].ps>=src.bmWidth) pMapX[i].ps=src.bmWidth-1;
  45.             if (pMapX[i].pe>=src.bmWidth) pMapX[i].pe=src.bmWidth-1;
  46.             fMin -= pMapX[i].ps;
  47.             pMapX[i].we = (LONG)(fMin * 256);
  48.             pMapX[i].ws = 256 - pMapX[i].we;
  49.         }
  50.     }
  51.     // 初始化pMapY
  52.     if (fZoomY<1.0f)
  53.     {
  54.         for (i=0;i<dest.bmHeight;i++)
  55.         {
  56.             fMin = i/fZoomY;
  57.             fMax = (i+1)/fZoomY;
  58.             pMapY[i].ps  = (int)fMin;
  59.             pMapY[i].pe  = (int)fMax;
  60.             if (pMapY[i].ps>=src.bmHeight) pMapY[i].ps=src.bmHeight-1;
  61.             if (pMapY[i].pe>=src.bmHeight) pMapY[i].pe=src.bmHeight-1;
  62.             pMapY[i].ws = (int)((pMapY[i].ps+1.0f-fMin)*fZoomY*256);
  63.             pMapY[i].we = (int)((fMax-pMapY[i].pe)*fZoomY*256);
  64.             pMapY[i].wi = 256-pMapY[i].ws-pMapY[i].we;
  65.         }
  66.     } else if (fZoomY==1.0f)
  67.     {
  68.         for (i=0;i<dest.bmHeight;i++)
  69.         {
  70.             pMapY[i].ps = i;
  71.             pMapY[i].pe = i;
  72.             pMapY[i].ws = 256;
  73.             pMapY[i].we = 0;
  74.         }
  75.     } else if (fZoomY&
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值