Хитрость заключается в обратном: не пытайтесь поместить пиксель исходного изображения в масштабированное изображение, но найдите пиксель в исходном изображении, который должен быть помещен в масштабированное изображение.
Это будет выглядеть примерно так:
float scaleFactor = 3.0f;
for (int y=0; y < scaledImageHeight; y++)
for (int x=0; x < scaledImageWidth; x++) {
int sourceImageX = (int)std::max(x * 1.0f / scaleFactor, (float)(sourceImageWidth - 1));
int sourceImageY = (int)std::max(y * 1.0f / scaleFactor, (float)(sourceImageHeight - 1));
scaledImage[y * scaledImageWidth + x] = sourceImage[sourceImageY * sourceImageWidth + sourceImageX];
}
В демонстрационных целях этот код сжимает изображение в правом нижнем углу, поэтому программа не аварийно завершает работу из-за переполнения массива (для этого используется std :: max).