максимального значения счетчика серии.
Таким образом, если в изображении все соседние отсчеты
отличаются друг от друга, то есть счетчики всех серий равны 1, то код окажется в два раза длиннее, чем объем памяти, занимаемый самим изображением. Но по мере уменьшения вероятности появления новых значений отсчетов, коэффициент сжатия увеличивается.
Этот метод не эффективен при кодировании полутоновых изображений, в которых практически отсутствуют повторяющиеся последовательности уровней яркости. Одна из схем кодирования
RLE представлена на рисунке 8.3. В этой схеме для кодирования серии длиной в 1 отсчет используется
пакет только в том случае, когда значение отсчета превышает максимальное значение счетчика группы, в противном случае в поток выводится только 1 байт, содержащий значение отсчета. В данном примере выбран размер серии, равный 127, максимальное значение счетчика задано равным 128
10=80
16. Cтарший бит счетчика равен 1, он является флагом пакета. Остальные 7 разрядов позволяют записать длину серии (размер серии ограничен 127 отсчетами). Если серия одинаковых отсчетов превышает этот размер, то формируется новый пакет. Кроме того, на этой схеме кодирование выполняется по строкам. При этом серия завершается последним отсчетом текущей строки. Алгоритм, представленный на рисунке 8.3 выполняется для каждой строки изображения.
Схема алгоритма декодирования представлена на рисунке 8.4.
Обнуляется счетчик строки i. Формируется маска
MaskValue, позволяющая выделить счетчик серии. В нашем случае она равна $7F. Считывается байт из потока. Если его значение не меньше
FlagRLE, то этот байт содержит значение счетчика в пакете. Следовательно, производится выделение значения счетчика
RunCount. Считывается следующий байт из потока,
второй байт пакета Curr. В буфер строки выводится
RunCount раз значение
Curr. Если же значение байта
Curr меньше
FlagRLE, следовательно, это не пакет, а одиночный отсчет.
Значение RunCount устанавливается в 1. В буфер строки выводится одно значение
Curr. Счетчик длины строки
i увеличивается на
RunCount. Эта последовательность операций выполняется, пока значение счетчика остается меньшим длины строки изображения. Для каждой следующей строки снова выполняется алгоритм, представленный на рисунке 8.4.
Недостатком
RLE кодирования является низкая помехоустойчивость метода. Изменение яркости вследствие помехи приводит к изменению яркости всей последовательности (штрихи вдоль строк) или к “раздергиванию” строк в случае изменения длины серии вследствие помехи. Достоинством метода является простота его реализации. Этот метод используется в графических форматах
BMP,
PCX,
TIFF и
TARGA,
как дополнительный в формате JPEG.
Рисунок 8.3 Блок-схема алгоритма кодирования длин серий строки изображения.