本帖最后由 didilc 于 2013-09-11 17:06:23 编辑

解决方案 »

  1.   

    双线性插值图像放大/缩小算法 http://wenku.baidu.com/view/ea2c6fcf0508763231121299.html
      

  2.   

    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////  
    //放大或者缩小RGB24,采用双线性插值算法  
    //////////////////////////////////////////////////////////////////////////  
    void ZoomBitMap(unsigned char *pSrcImg, unsigned char *pDstImg, int nWidth, int nHeight, float fRateW,float fRateH)  
    {
    int i = 0;  
    int j = 0;   float fX, fY;   int iStepSrcImg = nWidth;  
    int iStepDstImg = nWidth * fRateW;   int iX, iY;   unsigned char bUpLeft, bUpRight, bDownLeft, bDownRight;  
    unsigned char gUpLeft, gUpRight, gDownLeft, gDownRight;  
    unsigned char rUpLeft, rUpRight, rDownLeft, rDownRight;   unsigned char b, g, r; int iHightValue = nHeight * fRateH;
    int iWidthValue = nWidth * fRateW; for(i = 0; i < iHightValue; i++)  
    {
    fX = ((float)j) /fRateW;  
    fY = ((float)i) /fRateH; for(j = 0; j < iWidthValue; j++)  
    {
    iX = (int)fX;  
    iY = (int)fY;   bUpLeft  = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 0];  
    bUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 0];   bDownLeft  = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 0];  
    bDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 0];   gUpLeft  = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 1];  
    gUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 1];   gDownLeft  = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 1];  
    gDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 1];   rUpLeft  = pSrcImg[iY * iStepSrcImg * 3 + iX * 3 + 2];  
    rUpRight = pSrcImg[iY * iStepSrcImg * 3 + (iX + 1) * 3 + 2];   rDownLeft  = pSrcImg[(iY + 1) * iStepSrcImg * 3 + iX * 3 + 2];  
    rDownRight = pSrcImg[(iY + 1) * iStepSrcImg * 3 + (iX + 1) * 3 + 2];   b = bUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + bUpRight * (fX - iX) * (iY + 1 - fY)  
    + bDownLeft * (iX + 1 - fX) * (fY - iY) + bDownRight * (fX - iX) * (fY - iY);   g = gUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + gUpRight * (fX - iX) * (iY + 1 - fY)  
    + gDownLeft * (iX + 1 - fX) * (fY - iY) + gDownRight * (fX - iX) * (fY - iY);   r = rUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + rUpRight * (fX - iX) * (iY + 1 - fY)  
    + rDownLeft * (iX + 1 - fX) * (fY - iY) + rDownRight * (fX - iX) * (fY - iY);   if(iY >= 0 && iY <= nHeight * 2 && iX >= 0 && iX <= nWidth * 2)  
    {  
    pDstImg[i * iStepDstImg * 3 + j * 3 + 0] = b;        //B  
    pDstImg[i * iStepDstImg * 3 + j * 3 + 1] = g;        //G  
    pDstImg[i * iStepDstImg * 3 + j * 3 + 2] = r;        //R  
    }  
    }  
    }