Разработка и ромхакинг > Программирование

Разбить изображение на неповторяющиеся тайлы

(1/1)

Guyver(X.B.M.):
Чем можно такое сделать?

У меня нарисована картинка bmp 512 х 96 пикселей, и мне надо разбить изображение на тайлы 8 х 8 пикселей и убрать все повторяющиеся тайлы, оставив только по одному экземпляру таких тайлов. Чем это сделать? Существует ли какой-то онлайн сервис для таких вещей?

Т.е. мне из изображения надо составить тайловую карту.

lupus:
Какой-нибудь чат гпт такое умеет?

SeregaZ:
так по моим заветам :) это не сложно. а докучи можно и палетквант прикрутить, чтоб прям до полного блекджеку. правда если это про сеговскую графику речь. если не про сеговскую, то осуждаю! :) но на самом деле просто поменять количество цветов на то что нужно и все будет точно так-же работать.

Guyver(X.B.M.):
Я могу и сам написать что-то подобное в теории, но неохота время тратить, так как программист из меня так себе. Просто думал, что есть что-то подобное и общеизвестное...

SeregaZ:
в принципе в дюновском редакторе такое думаю можно сделать - вставить картинку из буфера обмена и разбить на тайлы, палитру и карту. по моему там на всю длинну картинку вставить можно, то есть не 320, а с учетом правой заэкранной части. просто потом карту подрезать в хекс редакторе, так как карту сделает полноразмерную. но я уже все забыл. а под рукой нет ни сборщика Дюны, ни редактора к ней...

дюноводы со сборщиком и редактором есть в сети? нам надо натурные тесты провести :)

Добавлено позже:
во... выкидыватель тайлов есть. пойдет? но там не создает палитру. вписывает в загруженную. правда он еще и криво работает... но это нормально. я ж делал.

Добавлено позже:
сначала загрузить в три окошка снизу существующую карту, сет и палитру - в архиве из дюны эти файлы. после из буфера обмена скопируй картинку 512х224 и жмакай... эээ... слева кнопки без картинок (потерялись где-то иконки пасте-копи). одна должна вставить из буфера обмена картинку. после жмакнуть экспорт. но палитра, повторюсь, будет существующая. система попробует вписать твою картинку в существующую палитру. вставку со своей палитры я видимо недокрутил...

Добавлено позже:
а я пойду гляну остались ли сурсы от него... выкинуть полоску зеленую надо. и чтоб со своей палитрой вставлять можно было.

Добавлено позже:
удалил выкидыватель. наш форумный проект подойдет. просто докрутим туда 512 ширину вместо 320... сек.

Добавлено позже:
кароче смотри... свою картинку наложи на большую картинку 512х224, просто в верхней части. после вставляй. галки никакие не ставь. то есть кнопка import, потом обязательно кнопка выкинуть тайлы. потом кнопка save files. потом можно тест, но там покажет только 320х224. тот край за пределами экрана не покажет. но он там будет. после просто файл тайловой карты пореж в хекс редакторе, оставив только... эээ... сколько там 512х96 / 64 * 2... вроде столько байт.

Добавлено позже:
ну и нулевой тайл там будет пустой. возможно он все испортит :)

Chaotix:

--- Цитата: Guyver(X.B.M.) от 27 Январь 2026, 16:55:38 ---но неохота время тратить, так как программист из меня так себе. Просто думал, что есть что-то подобное и общеизвестное...

--- Конец цитаты ---
Нейронки смогут сгенерить.
Вот самодостаточным бинарником: (404: этот скрипт в следующем сообщении, но уже не exe)
Не факт, что такое как нужно. Но задача тоже не очень точно была поставлена и без примера.

Sharpnull:
Форматы tileset, tilemap, палитры разные, поэтому делается под нужную платформу или проект. Я пишу скрипт для каждого случая. Например, для NES бывает нужно разбирать графику на несколько CHR банков, поэтому индексы тайлов начинаются заново.
Приложите пример картинки и в каком формате файлы на выходе, попробую адаптировать простой скрипт на Python (без нейронок). Предполагается, что изображение уже в индексированном виде.

SeregaZ:
вобще так то да... он жеж не сказал какая платформа :))) я по привычке про мегадрайву думаю.

Guyver(X.B.M.):
Да на платформу пофигу, к примеру денди. Для примера такой файл png (512 х 96 пикселей, надо разбить на тайлы 8 х 8 без повторений):

https://dropmefiles.com/lho8v

Можно работать и с растровым bmp, пересохранив файл...

SeregaZ:
о блин... про тайловые карты дендей не знаю :( так что мой вариант не пойдодет. у меня только любимая мегадрайв  :blush: (ибо в тайловой карте приоритет, выбор палитры, зеркала - не думаю что в денде так-же)

Chaotix:
Уникальных тайлов найдено: 32
"Карта тайлов для test_image_512x96.png
Сдвиг сетки: x=0, y=0
Размер тайла: 8×8

tile_0000.png (hash: 7ef9283c...)
  Встречается 672 раз(а) в позициях:
    (0, 0)
    (8, 0)
    (16, 0)
    (24, 0)
    (32, 0)
    (40, 0)
    (48, 0)
    (56, 0)
    (64, 0)
    (72, 0)
    ... ещё 662

tile_0001.png (hash: 6708de0b...)
  Встречается 3 раз(а) в позициях:
    (56, 64)
    (320, 72)
    (424, 72)

tile_0002.png (hash: 4ec487c1...)
  Встречается 3 раз(а) в позициях:
    (64, 64)
    (328, 72)
    (432, 72)

tile_0003.png (hash: ee5cbee4...)
  Встречается 3 раз(а) в позициях:
    (72, 64)
    (336, 72)
    (440, 72)

tile_0004.png (hash: d5aeca93...)
  Встречается 2 раз(а) в позициях:
    (80, 64)
    (448, 72)

tile_0005.png (hash: fff5e077...)
  Встречается 2 раз(а) в позициях:
    (288, 64)
    (40, 72)

tile_0006.png (hash: 37f2bf79...)
  Встречается 3 раз(а) в позициях:
    (296, 64)
    (48, 72)
    (344, 72)

tile_0007.png (hash: f633d9c2...)
  Встречается 3 раз(а) в позициях:
    (144, 72)
    (216, 80)
    (272, 88)

tile_0008.png (hash: 79a84fc6...)
  Встречается 6 раз(а) в позициях:
    (152, 72)
    (176, 72)
    (40, 80)
    (208, 80)
    (224, 80)
    (304, 80)

tile_0009.png (hash: 08ea0049...)
  Встречается 3 раз(а) в позициях:
    (160, 72)
    (456, 80)
    (112, 88)

tile_0010.png (hash: 14eb3dcd...)
  Встречается 6 раз(а) в позициях:
    (168, 72)
    (184, 80)
    (200, 80)
    (296, 80)
    (464, 80)
    (336, 88)

tile_0011.png (hash: 8af4b8c7...)
  Встречается 2 раз(а) в позициях:
    (24, 80)
    (136, 80)

tile_0012.png (hash: 00924202...)
  Встречается 2 раз(а) в позициях:
    (32, 80)
    (472, 80)

tile_0013.png (hash: de4b32a6...)
  Встречается 27 раз(а) в позициях:
    (144, 80)
    (152, 80)
    (168, 80)
    (176, 80)
    (24, 88)
    (32, 88)
    (40, 88)
    (136, 88)
    (144, 88)
    (152, 88)
    ... ещё 17

tile_0014.png (hash: efa24b11...)
  Встречается 2 раз(а) в позициях:
    (160, 80)
    (192, 88)

tile_0015.png (hash: 22c0619e...)
  Встречается 4 раз(а) в позициях:
    (192, 80)
    (16, 88)
    (128, 88)
    (280, 88)

tile_0016.png (hash: 422521c5...)
  Встречается 2 раз(а) в позициях:
    (288, 80)
    (440, 88)

tile_0017.png (hash: 072d1550...)
  Встречается 1 раз(а) в позициях:
    (320, 80)

tile_0018.png (hash: 1f58fce6...)
  Встречается 2 раз(а) в позициях:
    (328, 80)
    (360, 88)

tile_0019.png (hash: fdab834c...)
  Встречается 1 раз(а) в позициях:
    (376, 80)

tile_0020.png (hash: c70ad686...)
  Встречается 1 раз(а) в позициях:
    (384, 80)

tile_0021.png (hash: dd66d1d1...)
  Встречается 1 раз(а) в позициях:
    (392, 80)

tile_0022.png (hash: a40d8640...)
  Встречается 1 раз(а) в позициях:
    (400, 80)

tile_0023.png (hash: 00b5ba02...)
  Встречается 1 раз(а) в позициях:
    (408, 80)

tile_0024.png (hash: e8c2808d...)
  Встречается 3 раз(а) в позициях:
    (480, 80)
    (64, 88)
    (352, 88)

tile_0025.png (hash: 0f307302...)
  Встречается 1 раз(а) в позициях:
    (8, 88)

tile_0026.png (hash: cc421fc0...)
  Встречается 2 раз(а) в позициях:
    (48, 88)
    (120, 88)

tile_0027.png (hash: b2627fac...)
  Встречается 2 раз(а) в позициях:
    (56, 88)
    (344, 88)

tile_0028.png (hash: ee17b357...)
  Встречается 1 раз(а) в позициях:
    (232, 88)

tile_0029.png (hash: c53e9ff6...)
  Встречается 2 раз(а) в позициях:
    (312, 88)
    (448, 88)

tile_0030.png (hash: f1fa75ec...)
  Встречается 3 раз(а) в позициях:
    (384, 88)
    (392, 88)
    (400, 88)

tile_0031.png (hash: 5aac652f...)
  Встречается 1 раз(а) в позициях:
    (488, 88)

"Такое нужно, что-ли?
del (в архиве было 32 тайла 8х8 и тайлсет, но на примере есть надпись Nintendo, поэтому лучше с форума убрать несвободные ассеты)

Вот ещё сайт:
https://portabledev.com/pvsneslib/tilesetextractor/

Он делает тайлсет без повторов, вроде бы. А тайлсет уже не проблема резать на тайлы.
С опцией Tolerance = 1 экономно получается, но незначительные изменения не учитывает.

Но, вообще, по NES я не эксперт, поэтому лучше помолчу. Думал, что просто готовый тайлсет нарезать на тайлы, пропустил что тайлмап тоже нужен. Хотя не вижу проблемы с тайлмапом, но тебе видней какой надо формат. Я в json делаю вообще.

Вот python скрипт, на всякий случай. Тоже нужен Pillow, конечно.
 tile_splitter2.zip (5.74 КБ - загружено 120 раз.)
Если надо добавить фичу (тайлмап), берешь код и идешь, например, в Deepseek (chat.deepseek.com), говоришь объяснить как работает и что добавить. С большой вероятностью в готовый код уже добавит.

На других языках будет дольше, Python + Pillow самый простой вариант. Тем более, что Sharpnull ниже готовое решение дал и оно генерит тайлмап и под формат NES.

Sharpnull:

--- Цитата: Guyver(X.B.M.) от 27 Январь 2026, 19:18:35 ---Да на платформу пофигу, к примеру денди
--- Конец цитаты ---
В каком-то формате выводить всё-таки нужно. Вот относительно универсальный скрипт, в 1-м аргументе передать PNG или BMP. Обрабатывает тайлы в RGB, в _tilemap.bin индексы тайлов по 1 байту как на NES, в _tiles.png тайлы, в _palette.png палитра. В_tiles_nes.bin тайлы как у NES, если цветов не больше 4, и можно изменить порядок индексов цветов (из палитры) вторым аргументом, например, "img_to_tilemap.py 1234.py 3210" сделает индексы наоборот. Скрипт только для 1 палитры (любого размера). Нужно установить Pillow в командной строке (от админа): pip install -U Pillow.

Guyver(X.B.M.):
Спасибо!

Марат:
MapImage2, который лежит у нас на сайте уже лет 10, наверное, такое умеет делать.

Guyver(X.B.M.):
У меня на старом ноуте он как-то странно работает... :neznayu:

Навигация

[0] Главная страница сообщений

Перейти к полной версии