Вы правы, что getPixel будет принимать только целочисленные координаты.
Вы можете выполнить собственную линейную интерполяцию, если не возражаете, что она медленная:
def lerp(a, b, coord):
if isinstance(a, tuple):
return tuple([lerp(c, d, coord) for c,d in zip(a,b)])
ratio = coord - math.floor(coord)
return int(round(a * (1.0-ratio) + b * ratio))
def bilinear(im, x, y):
x1, y1 = int(floor(x)), int(floor(y))
x2, y2 = x1+1, y1+1
left = lerp(im.getpixel((x1, y1)), im.getpixel((x1, y2)), y)
right = lerp(im.getpixel((x2, y1)), im.getpixel((x2, y2)), y)
return lerp(left, right, x)
Надежная реализацияbilinear
также включает проверку границ, когда координаты уходят с изображения.