Формат сжатия изображений без потерь. Сжатие потоковое, однопроходное. Поддерживается альфа канал. Почти всегда сжимает сильнее чем png.
Алгоритм подготовки потока:
Дельта кодирование пикселя от предыдущего или от верхнего или от предыдущего и верхнего. Выбирается лучший вариант
В красный и синий каналы записываются разница от зеленого канала
Для каждого канала, обрабатывается 8 вариантов алгоритмов сжатия, и выбирается лучший. Основных алгоритма два:
- (H) Алгоритм Хаффмана
- (SH) Знак числа переключает знак в потоке, алгоритм Хаффмана
На эти два алгоритма накладываются вариации статистики для кодов Хаффмана:
- Статистика по предыдущей строке
- Статистика по всем предыдущим строкам
И поддержка rle. В итоге получается 8 вариантов алгоритма:
- (H) Алгоритм Хаффмана, статистика по предыдущей строке
- (HA) Алгоритм Хаффмана, статистика по всем предыдущим строкам
- (SH) Знак числа переключает знак в потоке, алгоритм Хаффмана, статистика по предыдущей строке
- (SHA) Знак числа переключает знак в потоке, алгоритм Хаффмана, по всем предыдущим строкам
- (RH) Алгоритм Хаффмана, rle, статистика по предыдущей строке
- (RHA) Алгоритм Хаффмана, rle, статистика по всем предыдущим строкам
- (RSH) Знак числа переключает знак в потоке, rle, алгоритм Хаффмана, статистика по предыдущей строке
- (RSHA) Знак числа переключает знак в потоке, rle, алгоритм Хаффмана, по всем предыдущим строкам
Rle, используется только для нулей. Занимает еще один код. Собирается статистика, учитывая размер кода нуля и размера кода rle (чтобы итоговый размер был меньше).