Пора бы уже закончить жать картинки, но я всё никак не могу :)
Настрогал еще вариантов.
1. Реализовал rANS алгоритм
2. Поменял LZ77 и LZ78 на выдачу токенов.
3. Реализовал компрессию этих токенов через rANS.
Ну и в итоге как-то грустно, потому что от шага LZ* толку нету даже там, где, казалось бы, больше всего его должно было быть.
В итоге rANS сам по себе переплюнул LZ77 и LZ77+rANS на отфильтрованной картинке с кучей заливки.
Почему? А потому что энтропии очень мало. И не смотря на то что в токенах LZ средняя длина "повтора" около 95, rANS умудряется быть более эффективным.
Лучший результат буквально меньше, чем PNGшка
Настрогал еще вариантов.
1. Реализовал rANS алгоритм
2. Поменял LZ77 и LZ78 на выдачу токенов.
3. Реализовал компрессию этих токенов через rANS.
Ну и в итоге как-то грустно, потому что от шага LZ* толку нету даже там, где, казалось бы, больше всего его должно было быть.
В итоге rANS сам по себе переплюнул LZ77 и LZ77+rANS на отфильтрованной картинке с кучей заливки.
Почему? А потому что энтропии очень мало. И не смотря на то что в токенах LZ средняя длина "повтора" около 95, rANS умудряется быть более эффективным.
Лучший результат буквально меньше, чем PNGшка
👍1
Исправил LZ77 что бы тот не всегда кодировал референс, когда длина его слишком мала и дешевле закодировать литералы.
Размер уменьшился, стало прям сильно лучше, но все еще проигрывает чистому rANS-у фильтрованной картинки.
В том числе rANS-ирование токенов из LZ77.
Только на очень специфических картинка (как с драконом) можно получить лучший результат с LZ77 или LZ78.
А вот возьмем спрайтшит. А там... та же картина, да как так то?
Размер уменьшился, стало прям сильно лучше, но все еще проигрывает чистому rANS-у фильтрованной картинки.
В том числе rANS-ирование токенов из LZ77.
Только на очень специфических картинка (как с драконом) можно получить лучший результат с LZ77 или LZ78.
А вот возьмем спрайтшит. А там... та же картина, да как так то?
Вывод - сделать N режимов, дать пользователю выбирать и кнопку "найти самый оптимальный".
Где пользователь, это тот кто напишет
А кнопка - функция
Где пользователь, это тот кто напишет
jkl = "1.0" у себя в Cargo.tomlА кнопка - функция
🔥2