За последние пару дней я немного повозился с PNG, и я расстроен своими выводами. Я делаю вывод, что большинство моих результатов касаются сжатия. Так что в эти выходные я собираюсь погрузиться в продвинутые статьи о сжатии. Я хотел бы поделиться своими выводами до сих пор. Чтобы узнать, есть ли у кого-нибудь совет по достижению моей цели и, возможно, указать мне правильное направление.
В настоящее время я работаю над проектом, в котором мне нужно получить наименьший возможный размер файла в пределах окна менее 15 секунд.
Большинство изображений, с которыми я работаю, - это PNG-8bpp с полной 256-цветовой палитрой. Большинство этих изображений я мог бы точно представить с 5bpp (32 цвета).
PNG проиндексирован, однако поддерживает только 1,2,4 и 8bpp. Поэтому моя идея заключалась в том, чтобы сократить формат PNG до минимума, который мне требовался, и написать кодер / декодер для поддержки секций IDAT с 3,5,6 или 7 бит / с.
Test 1:
Original File: 61.5KB, 750 * 500, 8pp Palette, 256 colors, No tRNS
After Optimizations (Reductions to 4bpp, Strip Anx Chunks, & PNGOUT): 49.2KB 4bpp, 16 Colors
Human Interpretation: I can see 6 distinguishable colors.
Поскольку для представления изображения мне нужно всего шесть цветов, я решил закодировать IDAT с использованием 3bpp, чтобы получить максимальную палитру из 8 цветов. Сначала я распаковал IDAT, что привело к новому размеру файла 368 КБ. После применения 3bpp к IDAT размер моего нового несжатого файла составляет 274 КБ. Я пошел к тому, что казалось хорошим началом ... Затем я применил deflate к своему новому разделу IDAT. Результат ... 59КБ.
10KB больше, чем при использовании 4bpp.
Test 2:
Original File: 102KB, 1000 * 750, 8bpp, 256 Colors, tRNS 1 fully transparent color
After Optimization: 79KB, 8bpp, 193 colors, tRNS 1 full transparent color
Human Interpretation: I need about 24 colors to represent this picture.
24 цвета могут быть представлены в 5bpp на 32 цвета. Используя ту же технику, описанную выше, я смог добиться гораздо лучших результатов по сравнению с несжатыми, но снова потерял при сжатии. Окончательный размер сжатый ... 84KB. Затем я попытался на 6,7bpp ... Сжатие с тем же результатом, что и на 8bpp.
Просто чтобы быть уверенным, что я сохранил все несжатые изображения и попробовал несколько других алгоритмов сжатия ... LZMA, BZIP2, PAQ8 ... тот же результат, меньший размер сжатия на 8bpp, чем на 5,6, или 7bpp И меньший размер на 4bpp чем при 3bpp.
Почему это происходит? Могу ли я настроить / изменить алгоритм сжатия для целевого формата, подобного PNG, который использует формат 5,6 или 7bpp, обеспечивающий сжатие 8bpp? Стоит ли это времени ... и да, сохранение еще 10 КБ будет стоить.