В последние пару дней я немного поработал с PNG, и я расстроен своими выводами. Я заключу, что большинство моих результатов касается сжатия. Поэтому в эти выходные я собираюсь погрузиться в передовые статьи сжатия. Я хотел поделиться своими выводами до сих пор. Чтобы узнать, есть ли у кого-нибудь советы по достижению моей цели и, возможно, указать мне в правильном направлении.Формат пользовательского изображения: как настроить алгоритмы сжатия
В настоящее время я работаю над проектом, где мне нужно получить наименьший размер файла в окне менее 15 секунд.
Большинство изображений, с которыми я работаю, это PNG-8bpp с полной 256 цветовой палитрой. Большинство этих изображений я мог точно представлять с 5bpp (32 цвета).
PNG индексируется, однако поддерживает только 1,2,4 и 8bpp. Поэтому моя идея состояла в том, чтобы разделить формат PNG на минимальную требуемую мне информацию и написать кодировщик/декодер для поддержки разделов IDAT с 3,5,6 или 7bpp.
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 КБ. Я был на том, что казалось хорошим началом ... Затем я применил дефляцию к моей новой секции 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 цветах. Используя ту же технику выше, я смог добиться гораздо лучших результатов по сравнению с несжатым, но снова потерял при сжатии. Конечный размер сжат ... 84 КБ. Затем я пробовал на 6,7bpp ... тот же результат хуже сжатие, что при 8bpp.
Просто, чтобы быть уверенным, что я сохранил все несжатые изображения и попробовал несколько других алгоритмов сжатия ... LZMA, BZIP2, PAQ8 ... тот же результат уменьшил размер сжатия на 8bpp, чем на 5,6, или 7bpp и меньший размер при 4bpp, чем на 3bpp.
Почему это происходит? Могу ли я настроить/модифицировать алгоритм сжатия для таргетинга формата PNG, который использует формат 5,6 или 7bpp, который содержит сжатие beast 8bpp? Стоит ли времени ... и да сохранить еще 10 КБ будет стоить того.
Байт фильтрации всегда будет равен нулю перед каждой строкой сканирования. Из того, что я читал, фильтрация часто не выгодна для индексированных изображений. Поэтому я также удалил байт фильтра, чтобы сэкономить место. Мне также не нужно использовать deflate для сжатия секции IDAT ... Я все еще проверяю другие параметры алгоритма сжатия, чтобы увидеть, могу ли я настроить меньшее значение bpp. –
Фильтрация может быть полезна для индексированных изображений; это зависит от изображения. Как я уже сказал выше, вы боретесь как с преимуществами фильтрации PNG, так и со сжатием FLATE, которые ищут повторяющиеся байты (а не пиксели). Если у вас есть непрерывные тональные (фототипы) изображения, вы не получите гораздо лучшего сжатия, чем JPEG. Для мультяшных или линейных рисунков LZW (GIF) может улучшить для вас размер нечетных пикселей. – BitBank
В отсутствие теста, который я провел, размер файла GIF меньше на 5-7bpp, чем PNG8 с той же уменьшенной палитрой. Я смог добиться лучшего сжатия с использованием 6bpp и заполнить последние два бита шаблоном, чем исходный PNG8. Интересно, есть ли способ установить компрессор для поиска паттернов каждый х байтов? Так что для 6bpp я хотел бы каждые 3 байта для шаблона. Я попытаюсь поиграть с LZMA и переключателями lc lp p. –