Farbfeld - новый формат изображений

И если вы о нём не слышали, я рекомендую прочитать его faq

И хоть faq довольно понятный, я считаю, что можно было сделать лучше, тем более что там не было статистик или объяснения, почему рекомендуется использовать именно bzip2

Вообще, дававйте начнём с самого начала - почему farbfeld это хороший формат? Каковы его сильные стороны?

Ну что же, как написано в faq, это очень простой формат, что означает, что вполне легко написать программу для работы с ним. Но есть гораздо больше плюсов. На самом деле, это один из самых быстрых и маленьких форматов, которые не теряют качества. Дайте мне это повторить - farbfeld не просто для бородатых кодеров - он объективно лучше* и лёгкая замена таким форматам, как png!

Однако всё не так хорошо - разработчики многих форматов изображений пытались создать баланс между хорошим коэффицентом сжатия и скоростью и они попали прямо в середину. Farbfeld не может (всегда) быть одновременно быстрее и меньше. Но это тоже плюс - каждый может выбрать любую вариацию и неважно какой она будет, её всё равно смогут все просмотреть, потому что это всё farbfeld!


И чтобы показать его мощь, я сделал пару...

Бэнчмарков!!!

ФайлРазмерСкорость сжатияСкорость разжатия
wall.ff.bz258K1.795s0.108s
wall.ff.br64K1.373s0.024s
wall.ff.xz66K0.284s0.022s
wall.ff.zst (лучший)75K0.289s0.019s
wall.ff.zst (оптимальный)77K0.15s0.016s
wall.ff.zst (по-умолчанию)100K0.011s0.015s
wall.ff.gz (по-умолчанию)128K0.062s0.049s
wall.png151K0.114s0.02s
wall.ff.lz4 (лучший)181K0.355s0.015s
wall.ff.lz4 (оптимальный)183K0.055s0.015s
wall.ff.lzo (лучший)204K0.24s0.016s
wall.ff.gz (быстрейший)217K0.041s0.044s
wall.ff.lz4 (по-умолчанию)231K0.012s0.015s
wall.ff.zst (быстрейший)246K0.008s0.016s
wall.ff.lzo (по-умолчанию)254K0.008s0.017s
wall.ff.lz4 (быстрейший)274K0.012s0.015s
wall.ff16M0s0s

Это довольно простая картинка, и здесь большинство методов сжатия превосходят png, а zst по-умолчанию например полностью заменяет его. bzip2 практически в 3 раза меньше

Здесь, я уже хотел завершить тестирование и думать, если мне стоит использвать zstd или xz, но затем я подумал:

Что насчёт более сложных изображений?


ФайлРазмерСкорость сжатияСкорость разжатия
painting.png13M2.9s0.16s
painting.ff.bz213M2s1.4s
painting.ff.xz (по-умолчанию)13M8.3s0.175s
painting.ff.br (по-умолчанию)14M1m12s0.165s
painting.ff.zst (лучший)15M18.6s0.1s
painting.ff.zst (оптимальный)16M17.6s0.08s
painting.ff.xz (быстрейший)17M0.3s0.09s
painting.ff.gz (по-умолчанию)17M2.4s0.33s
painting.ff.br (оптимальный)17M9.45s0.165s
painting.ff.zst (по-умолчанию)21M0.3s0.09s
painting.ff.gz (лучший)22M2.9s0.33s
painting.ff.gz (быстрейший)25M0.635s0.37s
painting.ff.br (оптимальный)25M0.3s0.23s
painting.ff.lz4 (лучший)27M0.52s0.05s
painting.ff.lzo (лучший)28M4s0.14s
painting.ff.br (быстрейший)28M0.21s0.25s
painting.ff.lzo (по-умолчанию)36M0.16s0.13s
painting.ff.lz4 (по-умолчанию)40M0.06s0.05s
painting.ff.zst (быстрейший)51M0.09s0.05s
painting.ff.lz4 (быстрейший)52M0.05s0.05s
painting.ff64M0s0s

Теперь вы можете сказать: "Ну вот здесь у png лучший коэффицент сжатия и всё ещё неплохая скорость! Это должен быть лучший формат для более больших/сложных картинок, так ведь?"

НЕВЕРНО

Авторы формата рекомендуют использовать bzip2 за его хороший коэффицент сжатия, но они наверняка не видели этого:

painting.ff.xz (ff-заточенное) 8.5M 10.65s 0.16s

Да, это так: можно получать картинки куда меньше чем png, без потери качества, и имея такую же скорость расжатия!

Так что если вам особо не важна скорость сжатия (как мне), то это - лучший вариант (если вы только не хотите скорости и только скорости - в этом случае используйте сырой .ff)


Конечно для каждого сценария есть разные методы сжатия, которые могут быть использованы

Например я использую сырые .ff файлы для своих обоев, так как я использую их каждый день и хочу сохранить как можно больше циклов процессора и одно изображение не занимает особо много места

Как сделать?

Команда, которую я использовал для создания ff-заточенных картинок:

xz --delta=dist=8 --lzma2=pb=3 painting.ff

И если вы этому всё ещё не верите, вот бэнчмарк альбома со 101 фотографией:

ФайлРазмерСкорость сжатияСкорость разжатия
ff.tar.xz (ff-заточенное)88M27.5s0.5s
ff.tar.xz (лучший)97M1m1.2s
ff.tar.bz297M21.3s10.1s
ff.tar.xz (по-умолчанию)100M21.8s0.4s
ff.tar.br104M10m0.9s
ff.tar.zst (лучший)115M3m0.6s
ff.tar.zst (оптимальный)118M2m0.5s
ff.tar.xz (быстрейший)127M3s0.4s
ff.tar.br (оптимальный)129M1m0.9s
png.tar136M21s2.5s
ff.tar.zst (по-умолчанию)151M5.4s0.5s
ff.tar.gz (лучший)166M21s2s
ff.tar.gz (быстрейший)186M4.5s2.2s
ff.tar.lz4 (лучший)187M3.4s0.2s
ff.tar.lzo (лучший)193M31.5s0.7s
ff.tar.br (быстрейший)202M1.3s1.5s
ff.tar.lzo (по-умолчанию)257M1s0.6s
ff.tar.lz4 (по-умолчанию)279M0.2s0.2s
ff.tar.zst (быстрейший)337M0.5s0.2s
ff.tar.lz4 (быстрейший)342M0.1s0.1s
ff.tar466M0s0s

Как вы можете видеть, ff-заточенное сжатие гораздо лучше всех других, по крайней мере для моих нужд

И да, сжатие нескольких файлов за раз для более хорошего коэффицента сжатия это тоже одна из функций farbfeld, а, если вам интересно, то сжатие всех картинок индивидуально даёт чуть более высокую скорость, но с более плохим коэффицентом сжатия. Всё еще лучше чем png!

Поддержка (или её отстутствие) farbfeldа

Существует всего-лишь несколько приложений, которые поддерживают этот прекрасный формат, но я всё равно перечислю те, о которых я знаю

Так что если вы разрабатываете программу, то пожалуйста добавьте поддержку farbfeld. Это сделало бы всех счастливыми и мы были бы на один шаг ближе к тому, чтобы о нас узнали