как можно превратить 8x8 тайлы в 16x16 через Pillow?
Не понятно что именно нужно. PIL не работает с тайлами, все преобразования для получения обычной картинки, где пиксели идут слева направо и сверху вниз, нужно делать самому. Скорее всего есть пакеты/код для работы с тайлами, но самому не проблема сделать. Если речь про увеличение картинки 8x8 > 16x16, есть resize(). Если нужно 4 тайла 8x8 расставить слева направо и сверху вниз, пишите обычный код на Python, например во внешнем цикле вычисляйте X, Y верхнего левого угла тайла в конечной картинке (16x16) и от него записывайте тайл. Возможно проще использовать возможность PIL писать в пиксели по X, Y (
https://pillow.readthedocs.io/en/stable/reference/PixelAccess.html). Для общего кода можно сделать метод, который принимает тайлы (tileset), размер карты (map) и индексы тайлов (tilemap), для вдохновения можно посмотреть формат в программе Tiled.
UPD: Ещё есть ленивый, но скорее всего медленный вариант. У вас есть в конце кода готовый тайл (image), можно сделать так 4 раза и наложить эти 8x8 тайлы как отдельные картинки на картинку 16x16 через PIL, только указать X, Y угла (
https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.paste). Для 16x16 можно использовать в цикле готовые координаты: ((0,0), (8,0), (0,8), (8,8)).