2012-02-24 2 views
1

В последние пару дней я немного поработал с 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 КБ будет стоить того.

ответ

2

Что вы видите, так это то, что с использованием нечетных размеров пикселей эффективное сжатие уменьшается из-за того, как работает сжатие PNG. Преимущество сжатия PNG при использовании прямого сжатия FLATE/ZIP - это фильтрация. Сжатие PNG пытается использовать горизонтальную и вертикальную симметрию с небольшим ассортиментом фильтров предварительной обработки. Эти фильтры работают на границах байтов и эффективны с размерами пикселей 4/8/16/24/32/48/64 бит. Когда вы переходите на пиксель нечетного размера (3/5/6/7 бит), вы побеждаете фильтрацию, потому что идентично цветные пиксели не будут «отменяться друг от друга» горизонтально при фильтрации на 8-битных границах.

Даже если фильтрация не была проблемой, способ сжатия FLATE, уменьшая размер пикселя от 8 до 7 или 6 бит, не будет иметь большого эффекта ни потому, что он также предполагает размер символа 8 бит ,

В заключение ... единственное преимущество, которое вы можете достичь, используя нечетные размеры пикселей, состоит в том, что несжатые данные будут меньше. Разбирая симметричную граничную симметрию пикселей, вы проигрываете большую часть преимуществ сжатия PNG.

Сжатие GIF поддерживает все размеры пикселей от 1 до 8 бит.Он определяет размер символа как размер пикселя и не использует предварительную фильтрацию. 8-битное GIF-изображение, если оно сжато как 7-битные пиксели, не пострадает меньше сжатия, но также не принесет пользы, потому что сжатие больше зависит от повторения пикселей, чем от размера символа.

+0

Байт фильтрации всегда будет равен нулю перед каждой строкой сканирования. Из того, что я читал, фильтрация часто не выгодна для индексированных изображений. Поэтому я также удалил байт фильтра, чтобы сэкономить место. Мне также не нужно использовать deflate для сжатия секции IDAT ... Я все еще проверяю другие параметры алгоритма сжатия, чтобы увидеть, могу ли я настроить меньшее значение bpp. –

+0

Фильтрация может быть полезна для индексированных изображений; это зависит от изображения. Как я уже сказал выше, вы боретесь как с преимуществами фильтрации PNG, так и со сжатием FLATE, которые ищут повторяющиеся байты (а не пиксели). Если у вас есть непрерывные тональные (фототипы) изображения, вы не получите гораздо лучшего сжатия, чем JPEG. Для мультяшных или линейных рисунков LZW (GIF) может улучшить для вас размер нечетных пикселей. – BitBank

+0

В отсутствие теста, который я провел, размер файла GIF меньше на 5-7bpp, чем PNG8 с той же уменьшенной палитрой. Я смог добиться лучшего сжатия с использованием 6bpp и заполнить последние два бита шаблоном, чем исходный PNG8. Интересно, есть ли способ установить компрессор для поиска паттернов каждый х байтов? Так что для 6bpp я хотел бы каждые 3 байта для шаблона. Я попытаюсь поиграть с LZMA и переключателями lc lp p. –

0

сжатия DEFLATE используется PNG имеет два основных метода:

  • находит повторяющиеся байт последовательности и кодирует их в качестве обратных ссылок
  • кодирует байты с использованием кодирования Хаффмана

путем изменения длины пикселя из 8-битная вы не синхронизированы с границами байтов, а DEFLATE не сможет кодировать повторяющиеся прогоны пикселей как повторяющиеся байты.

И благодаря кодировке Хаффмана не имеет значения, что 8-битные пиксели имеют неиспользуемые биты, поскольку кодирование будет кодировать байты с кодами переменной ширины, присваивая самые короткие наиболее часто встречающиеся значения.

Смежные вопросы