double pos; short* RowOffset = (short*)malloc(NewWidth * sizeof(short)); short* RowPartXX = (short*)malloc(NewWidth * sizeof(short)); for (int X = 0; X < NewWidth; X++) { pos = (double)X * (Width - 1) / (double)NewWidth; RowOffset[X] = pos; RowPartXX[X] = (pos - (int)pos) * 2048; } for (int Y = 0; Y < NewHeight; Y++) { unsigned char* LinearDest = Dest + Y * NewWidth; pos = Y * (Height - 1) / NewHeight; int PartYY = (pos - (int)pos) * 2048; int InvertYY = 2048 - PartYY; int ColOffset = int(pos); unsigned char* LinearSrc = Src + ColOffset * Width; unsigned char* LinearSrc1 = Src + (ColOffset + 1) * Width; for (int X = 0; X < NewWidth - 1; X++) { int PartXX = RowPartXX[X]; int InvertXX = 2048 - PartXX; LinearDest[X] = ((LinearSrc[RowOffset[X]] * InvertXX + LinearSrc[RowOffset[X + 1]] * PartXX) * InvertYY + (LinearSrc1[RowOffset[X]] * InvertXX + LinearSrc1[RowOffset[X + 1]] * PartXX) * PartYY) >> 22; } } free(RowOffset); free(RowPartXX);