"Карта тайлов для 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)
"
Он делает тайлсет без повторов, вроде бы. А тайлсет уже не проблема резать на тайлы.
С опцией Tolerance = 1 экономно получается, но незначительные изменения не учитывает.
Но, вообще, по NES я не эксперт, поэтому лучше помолчу. Думал, что просто готовый тайлсет нарезать на тайлы, пропустил что тайлмап тоже нужен. Хотя не вижу проблемы с тайлмапом, но тебе видней какой надо формат. Я в json делаю вообще.
Вот python скрипт, на всякий случай. Тоже нужен Pillow, конечно.
Если надо добавить фичу (тайлмап), берешь код и идешь, например, в Deepseek (chat.deepseek.com), говоришь объяснить как работает и что добавить. С большой вероятностью в готовый код уже добавит.
На других языках будет дольше, Python + Pillow самый простой вариант. Тем более, что Sharpnull ниже готовое решение дал и оно генерит тайлмап и под формат NES.