Автор Тема: [SMD] Палитра в Genesis  (Прочитано 1347 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bqio

  • Пользователь
  • Сообщений: 20
  • Dark Master
    • Просмотр профиля
[SMD] Палитра в Genesis
« Ответ #30 : 14 Март 2023, 13:34:01 »
Sharpnull, не подскажите, как можно превратить 8x8 тайлы в 16x16 через Pillow?

https://gist.github.com/bqio/768a7bb9a805c9c45c614b27aef82cf4

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5005
    • Просмотр профиля
[SMD] Палитра в Genesis
« Ответ #31 : 14 Март 2023, 17:13:15 »
как можно превратить 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)).
« Последнее редактирование: 14 Март 2023, 18:11:01 от Sharpnull »

Оффлайн bqio

  • Пользователь
  • Сообщений: 20
  • Dark Master
    • Просмотр профиля
[SMD] Палитра в Genesis
« Ответ #32 : 15 Март 2023, 06:44:51 »
Не понятно что именно нужно. 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)).

Ну то есть вы вот так имели ввиду, да? Всё получилось, спасибо  :)

https://gist.github.com/bqio/768a7bb9a805c9c45c614b27aef82cf4

Во вложениях результат работы. Но по-моему я всё-таки где-то накосячил в палитре.  :neznayu:
« Последнее редактирование: 15 Март 2023, 07:17:46 от bqio »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5005
    • Просмотр профиля
[SMD] Палитра в Genesis
« Ответ #33 : 15 Март 2023, 19:41:05 »
Ну то есть вы вот так имели ввиду, да?
Да, только цикл вместо повторов по 3 раза строчек кода.
Но по-моему я всё-таки где-то накосячил в палитре
Ну так сравните с оригиналом. Кстати, 0-й цвет - прозрачный, поэтому стоит сделать его прозрачным или классической маджентой.