平滑放大缩小拉伸图像,本函数同时具有很高的效率。
其中BITMAP24结构和BITMAP 结构类似,在这里你可以假设两者相同。
pMapX,pMapY用于建立积卷映射表,同时将浮点运算转换成浮点运算。
其中BITMAP24结构和BITMAP 结构类似,在这里你可以假设两者相同。
pMapX,pMapY用于建立积卷映射表,同时将浮点运算转换成浮点运算。
- void ImageStretch(BITMAP24 & dest,const BITMAP24 & src)
- {
- ASSERT(dest.bmWidth>0 && dest.bmHeight>0);
- ASSERT(src.bmWidth>0 && src.bmHeight>0);
- double fZoomX = (double)dest.bmWidth/(double)src.bmWidth;
- double fZoomY = (double)dest.bmHeight/(double)src.bmHeight;
- LONG i;
- POINTMAP * pMapX;
- POINTMAP * pMapY;
- double fMin,fMax;
- pMapX = CImageDataMgr::instance().AllocXPointMap(dest.bmWidth);
- pMapY = CImageDataMgr::instance().AllocYPointMap(dest.bmHeight);
- // 初始化pMapX
- if (fZoomX<1.0f)
- {
- for (i=0;i<dest.bmWidth;i++)
- {
- fMin = i/fZoomX;
- fMax = (i+1)/fZoomX;
- pMapX[i].ps = (int)fMin;
- pMapX[i].pe = (int)fMax;
- if (pMapX[i].ps>=src.bmWidth) pMapX[i].ps=src.bmWidth-1;
- if (pMapX[i].pe>=src.bmWidth) pMapX[i].pe=src.bmWidth-1;
- pMapX[i].ws = (int)((pMapX[i].ps+1.0f-fMin)*fZoomX*256);
- pMapX[i].we = (int)((fMax-pMapX[i].pe)*fZoomX*256);
- pMapX[i].wi = 256-pMapX[i].ws-pMapX[i].we;
- }
- } else if (fZoomX==1.0f)
- {
- for (i=0;i<dest.bmWidth;i++)
- {
- pMapX[i].ps = i;
- pMapX[i].pe = i;
- pMapX[i].ws = 256;
- pMapX[i].we = 0;
- }
- } else if (fZoomX>1.0f)
- {
- for (i=0;i<dest.bmWidth;i++)
- {
- fMin = i/fZoomX;
- pMapX[i].ps = (LONG)fMin;
- pMapX[i].pe = pMapX[i].ps+1;
- if (pMapX[i].ps>=src.bmWidth) pMapX[i].ps=src.bmWidth-1;
- if (pMapX[i].pe>=src.bmWidth) pMapX[i].pe=src.bmWidth-1;
- fMin -= pMapX[i].ps;
- pMapX[i].we = (LONG)(fMin * 256);
- pMapX[i].ws = 256 - pMapX[i].we;
- }
- }
- // 初始化pMapY
- if (fZoomY<1.0f)
- {
- for (i=0;i<dest.bmHeight;i++)
- {
- fMin = i/fZoomY;
- fMax = (i+1)/fZoomY;
- pMapY[i].ps = (int)fMin;
- pMapY[i].pe = (int)fMax;
- if (pMapY[i].ps>=src.bmHeight) pMapY[i].ps=src.bmHeight-1;
- if (pMapY[i].pe>=src.bmHeight) pMapY[i].pe=src.bmHeight-1;
- pMapY[i].ws = (int)((pMapY[i].ps+1.0f-fMin)*fZoomY*256);
- pMapY[i].we = (int)((fMax-pMapY[i].pe)*fZoomY*256);
- pMapY[i].wi = 256-pMapY[i].ws-pMapY[i].we;
- }
- } else if (fZoomY==1.0f)
- {
- for (i=0;i<dest.bmHeight;i++)
- {
- pMapY[i].ps = i;
- pMapY[i].pe = i;
- pMapY[i].ws = 256;
- pMapY[i].we = 0;
- }
- } else if (fZoomY&