雙線性插值根據周圍4個點及與4個點的距離,來計算待插值像素的值
http://baike.baidu.com/link?url=4it85nPzCC9J0oZZGU7HEGuXbcDcOmzhtKuwTP9Nar9HLRyZdwKaocnn1yZOFJ7pdZjnXmTUpiKStH5nPs1qTq2V57th0nHQqc1m0_fzQXIklY4hFLnYg3T5kbqTibxqIUa_JFNV0sy8Y3_YX_XopK算法
下面是根據插值算法作的一個實現url
void bilinear_c_int(uchar *pSrc, int srcWidth, int srcHeight, uchar *pDst, int dstWidth, int dstHeight) { const int N = 8; const int FACTOR = pow(2, N); float fx = (float)srcWidth / dstWidth; float fy = (float)srcHeight / dstHeight; int *x = new int[dstWidth]; int *a = new int[dstWidth]; int *y = new int[dstHeight]; int *b = new int[dstHeight]; for (int j = 0; j < dstWidth; j++) { x[j] = (int)(fx * j); a[j] = (fx*j - x[j]) * FACTOR ; if (x[j] > srcWidth - 2) { x[j] = srcWidth - 2; a[j] = FACTOR; } } for (int i = 0; i < dstHeight; i++) { y[i] = (int)(fy * i); b[i] = (fy *i - y[i]) * FACTOR; if (y[i] > srcHeight - 2) { y[i] = srcHeight - 2; b[i] = FACTOR; } } int index, p0, p1; for (int i = 0; i < dstHeight; i++) { for (int j = 0; j < dstWidth; j++) { index = y[i] * srcWidth + x[j]; p0 = pSrc[index] * (FACTOR - a[j]) + pSrc[index + 1] * a[j]; p1 = pSrc[index + srcWidth + 1] * (FACTOR - a[j]) + pSrc[index + srcWidth + 1] * a[j]; pDst[i * dstWidth + j] = (p0 * (FACTOR - b[i]) + p1 * b[i]) >> (2 * N); } } delete[] x; delete[] a; delete[] y; delete[] b; }